From e974f91fe5cd2981d184e9c305b63cc3fc31678b Mon Sep 17 00:00:00 2001 From: Lei OT Date: Mon, 6 Jan 2025 16:19:42 +0800 Subject: [PATCH] =?UTF-8?q?perf(=E5=89=8D=E7=AB=AF):=20=E9=82=AE=E4=BB=B6:?= =?UTF-8?q?=20=E9=82=AE=E4=BB=B6=E5=BC=80=E5=A4=B4:=20=E5=AE=A2=E4=BA=BA?= =?UTF-8?q?=E5=90=8D=E5=AD=97,=20=E8=AE=A2=E5=8D=95=E5=8F=B7?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/actions/EmailActions.js | 6 ++++ src/hooks/useEmail.js | 32 +++++++++++++++++-- .../Online/Components/EmailDetail.jsx | 4 ++- .../Online/Components/EmailQuotation.jsx | 1 + .../Online/Input/EmailComposer.jsx | 1 + .../Online/Input/EmailEditorPopup.jsx | 10 ++++-- .../Conversations/Online/MessagesWrapper.jsx | 3 +- 7 files changed, 50 insertions(+), 7 deletions(-) diff --git a/src/actions/EmailActions.js b/src/actions/EmailActions.js index b39d49d..0d34ae7 100644 --- a/src/actions/EmailActions.js +++ b/src/actions/EmailActions.js @@ -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, } diff --git a/src/hooks/useEmail.js b/src/hooks/useEmail.js index 3cb3e3f..b35a15a 100644 --- a/src/hooks/useEmail.js +++ b/src/hooks/useEmail.js @@ -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}) => { diff --git a/src/views/Conversations/Online/Components/EmailDetail.jsx b/src/views/Conversations/Online/Components/EmailDetail.jsx index 38fb089..9153bd4 100644 --- a/src/views/Conversations/Online/Components/EmailDetail.jsx +++ b/src/views/Conversations/Online/Components/EmailDetail.jsx @@ -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 }} diff --git a/src/views/Conversations/Online/Components/EmailQuotation.jsx b/src/views/Conversations/Online/Components/EmailQuotation.jsx index 32c7b05..58f3d25 100644 --- a/src/views/Conversations/Online/Components/EmailQuotation.jsx +++ b/src/views/Conversations/Online/Components/EmailQuotation.jsx @@ -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}`} /> diff --git a/src/views/Conversations/Online/Input/EmailComposer.jsx b/src/views/Conversations/Online/Input/EmailComposer.jsx index 1f95b79..a553216 100644 --- a/src/views/Conversations/Online/Input/EmailComposer.jsx +++ b/src/views/Conversations/Online/Input/EmailComposer.jsx @@ -262,6 +262,7 @@ const EmailComposer = ({ ...props }) => { conversationid={currentConversation.sn} toEmail={toEmail} draft={quickData} + customerDetail={customerDetail} action='new' key={'email-new-editor-popup'} /> diff --git a/src/views/Conversations/Online/Input/EmailEditorPopup.jsx b/src/views/Conversations/Online/Input/EmailEditorPopup.jsx index d3c0180..667847b 100644 --- a/src/views/Conversations/Online/Input/EmailEditorPopup.jsx +++ b/src/views/Conversations/Online/Input/EmailEditorPopup.jsx @@ -59,7 +59,7 @@ const generateMailContent = (mailData) => `

${mailData.content}

` * @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 ? `

Dear Mr./Ms. ${customerDetail.name || ''}

Reference Number: ${oid}

` : ''); + // 没有引用邮件 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 () => {} diff --git a/src/views/Conversations/Online/MessagesWrapper.jsx b/src/views/Conversations/Online/MessagesWrapper.jsx index bf9be98..8edd7da 100644 --- a/src/views/Conversations/Online/MessagesWrapper.jsx +++ b/src/views/Conversations/Online/MessagesWrapper.jsx @@ -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}`}