Merge branch 'main' of github.com:hainatravel/global-sales

dev/supplier-email-drawer
LiaoYijun 6 months ago
commit a9bbf68323

@ -72,6 +72,12 @@ export const getEmailDetailAction = async (params) => {
return { info: encodeEmailInfo(result.MailInfo?.[0] || {}), content: mailType === 'text/html' ? parseHTMLString((result.MailContent || '').replace(/\r\n/g, '')) : (result.MailContent || ''), attachments: result?.AttachList || [] };
}
export const getEmailOrderAction = async ({ colisn }) => {
const { errcode, result } = await fetchJSON(`${API_HOST}/getorderinfo`, { colisn })
return errcode === 0 ? { ...result[0], customerDetail: result[0].contact[0] } : {}
}
/**
* 主动收邮件, 单个账户
* @param {object} { opi_sn, }

@ -1,6 +1,6 @@
import { useState, useEffect, useCallback } from 'react'
import { isEmpty } from '@/utils/commons'
import { getEmailDetailAction, postResendEmailAction, getSalesSignatureAction } from '@/actions/EmailActions'
import { getEmailDetailAction, postResendEmailAction, getSalesSignatureAction, getEmailOrderAction } from '@/actions/EmailActions'
import { App } from 'antd'
import useConversationStore from '@/stores/ConversationStore';
import { msgStatusRenderMapped } from '@/channel/bubbleMsgUtils';
@ -38,6 +38,8 @@ export const useEmailDetail = (mai_sn, data) => {
const {notification} = App.useApp()
const [loading, setLoading] = useState(false)
const [mailData, setMailData] = useState({ loading, info: {}, content: '', attachments: [] })
const [coliSN, setColiSN] = useState('');
const [orderDetail, setOrderDetail] = useState({});
const [updateMessageItem] = useConversationStore(state => [state.updateMessageItem]);
@ -50,6 +52,7 @@ export const useEmailDetail = (mai_sn, data) => {
setLoading(true)
const data = await getEmailDetailAction({ mai_sn })
setMailData(data)
setColiSN(data.info.MAI_COLI_SN)
setLoading(false)
} catch (err) {
setLoading(false)
@ -66,6 +69,31 @@ export const useEmailDetail = (mai_sn, data) => {
else setMailData(data)
}, [mai_sn])
useEffect(() => {
const getOrderDetail = async () => {
if (isEmpty(coliSN)) {
return false
}
try {
setLoading(true)
const data = await getEmailOrderAction({ colisn: coliSN })
setOrderDetail(data)
setLoading(false)
} catch (err) {
setLoading(false)
notification.error({
message: "请求失败",
description: err.message || '网络异常',
placement: "top",
duration: 3,
});
}
}
getOrderDetail()
}, [coliSN])
const postEmailResend = async ({ mai_sn, conversationid: externalid, actionId: actionid, ...body }) => {
if (isEmpty(mai_sn)) {
return false
@ -75,7 +103,7 @@ export const useEmailDetail = (mai_sn, data) => {
updateMessageItem({ conversationid: externalid, actionid, id: actionid, status: msgStatusRenderMapped['accepted'] })
}
return { loading, mailData, postEmailResend }
return { loading, mailData, orderDetail, postEmailResend }
}
export const EmailBuilder = ({subject, content}) => {

@ -48,7 +48,7 @@ const EmailDetail = ({ open, setOpen, emailMsg={}, disabled=false, ...props }) =
const [mobile] = useStyleStore((state) => [state.mobile])
const { loading, mailData, postEmailResend } = useEmailDetail(mailID)
const { loading, mailData, orderDetail, postEmailResend } = useEmailDetail(mailID)
const [showBindBtn, setShowBindBtn] = useState(false);
useEffect(() => {
setShowBindBtn(isEmpty(mailData.info?.MAI_COLI_SN))
@ -203,6 +203,8 @@ const EmailDetail = ({ open, setOpen, emailMsg={}, disabled=false, ...props }) =
fromUser={mailData.info?.MAI_OPI_SN || order_opi}
fromOrder={mailData.info?.MAI_COLI_SN || coli_sn}
conversationid={conversationid}
oid={orderDetail.order_no}
customerDetail={orderDetail.customerDetail}
// emailMsg={ReferEmailMsg}
quoteid={mailID}
initial={{ ...initialPosition, ...initialSize }}

@ -83,6 +83,7 @@ const EmailQuotation = ({ sfi_sn, ...props }) => {
// initial={{ ...initialPosition, ...initialSize }}
// mailData={mailData}
draft={draft}
// customerDetail={customerDetail}
action={'new'}
key={`email-quotation-new-popup_${currentConversation.sn}`}
/>

@ -262,6 +262,7 @@ const EmailComposer = ({ ...props }) => {
conversationid={currentConversation.sn}
toEmail={toEmail}
draft={quickData}
customerDetail={customerDetail}
action='new'
key={'email-new-editor-popup'}
/>

@ -59,7 +59,7 @@ const generateMailContent = (mailData) => `<br><br><p>${mailData.content}</p>`
* @property {string} quoteid - 引用邮件ID
* @property {object} draft - 草稿
*/
const EmailEditorPopup = ({ open, setOpen, fromEmail, fromUser, fromOrder, oid, toEmail, conversationid, quoteid, initial = {}, mailData: _mailData, action = 'reply', draft = {}, ...props }) => {
const EmailEditorPopup = ({ open, setOpen, fromEmail, fromUser, fromOrder, oid, toEmail, conversationid, quoteid, initial = {}, mailData: _mailData, action = 'reply', draft = {}, customerDetail={}, ...props }) => {
const { notification, message } = App.useApp();
const [form] = Form.useForm();
@ -93,6 +93,8 @@ const EmailEditorPopup = ({ open, setOpen, fromEmail, fromUser, fromOrder, oid,
setNewToEmail('')
}
const [contentPrefix, setContentPrefix] = useState('');
// : ID,
// , 使focus, ID
// , , ID,
@ -100,6 +102,8 @@ const EmailEditorPopup = ({ open, setOpen, fromEmail, fromUser, fromOrder, oid,
useEffect(() => {
const propsObj = { open, setOpen, fromEmail, fromUser, fromOrder, oid, toEmail, conversationid, quoteid, mai: _mailData?.info?.MAI_MAT_SN, action, draft }
setContentPrefix(oid ? `<p>Dear Mr./Ms. ${customerDetail.name || ''}</p><p>Reference Number: ${oid}</p>` : '');
//
if (isEmpty(quoteid)) {
setStickToProps(propsObj)
@ -197,7 +201,7 @@ const EmailEditorPopup = ({ open, setOpen, fromEmail, fromUser, fromOrder, oid,
// const _initialContent = isEmpty(mailData.info) ? signatureBody : signatureBody+preQuoteBody
if (!isEmpty(mailData.info) && action !== 'edit') {
setInitialContent(signatureBody)
setInitialContent(contentPrefix + signatureBody)
}
const _formValues = {
@ -230,7 +234,7 @@ const EmailEditorPopup = ({ open, setOpen, fromEmail, fromUser, fromOrder, oid,
const newEmail = { to: newToEmail, subject: draft?.subject || '' }
form.setFieldsValue(newEmail)
setInitialForm(newEmail)
setInitialContent((draft?.content || '') + signatureBody)
setInitialContent((draft?.content || contentPrefix || '') + signatureBody)
}
return () => {}

@ -30,7 +30,7 @@ const MessagesWrapper = ({ updateRead = true, forceGetMessages }) => {
const currentConversationSN = useConversationStore(useShallow((state) => state.currentConversation.sn));
const currentConversationColiSN = useConversationStore(useShallow((state) => state.currentConversation.coli_sn));
const [orderDetail, ] = useOrderStore(state => [state.orderDetail, ]);
const [orderDetail, customerDetail] = useOrderStore(state => [state.orderDetail, state.customerDetail ]);
const isVisible = useVisibilityState();
@ -268,6 +268,7 @@ const MessagesWrapper = ({ updateRead = true, forceGetMessages }) => {
fromUser={Number(orderDetail?.opi_sn || userId)}
fromOrder={currentConversation.coli_sn}
oid={orderDetail?.order_no}
customerDetail={customerDetail}
quoteid={ReferEmailMsg.mai_sn || ReferEmailMsg.id}
conversationid={currentConversation.sn}
key={`email-msg-reply-top-popup_${ReferEmailMsg.id}`}

@ -24,8 +24,9 @@ const timeField = { saved: 'createTime', pending: 'createTime', sent: 'sendTime'
const statusMapped = { saved: 'accepted', pending: 'accepted', sent: 'sent', delivered: 'delivered', read: 'read', failed: 'failed' };
const directionField = { 'message:received': 'inbound', 'message:updated': 'outbound' };
const directionPrefix = { inbound: 'in_', outbound: 'out_' };
const directionIdUserPrefix = { inbound: 'to', outbound: 'from' };
const uniqueMsgId = msg => (msg.id && msg.direction ? `${directionPrefix[msg.direction]}${msg.to.replace('+', '')}_${msg.id}` : undefined);
const uniqueMsgId = msg => (msg.id && msg.direction ? `${directionPrefix[msg.direction]}${msg[directionIdUserPrefix[msg.direction]].replace('+', '')}_${msg.id}` : undefined);
/**
* @returns {Object} webhookBody

Loading…
Cancel
Save