feat: 报价信生成邮件

dev/emitter
Lei OT 10 months ago
parent 7233af3e4d
commit 4845ac0a82

@ -75,3 +75,12 @@ export const getEmailFetchAction = async (param) => {
})
return result
};
/**
* 报价信邮件草稿
* @param {object} { sfi_sn, coli_sn, lgc }
*/
export const getEmailQuotationDraftAction = async (param) => {
const { result } = await fetchJSON(`${EMAIL_HOST}/QuotationLetter`, param)
return { subject: (result.Subject || ''), content: (result.MailContent || '').replace(/[\r\n]/g, '') }
}

@ -0,0 +1,91 @@
import { useEffect, useState } from 'react'
import { App, Button } from 'antd'
import EmailEditorPopup from '../Input/EmailEditorPopup'
import { useOrderStore } from '@/stores/OrderStore'
import useAuthStore from '@/stores/AuthStore'
import useConversationStore from '@/stores/ConversationStore'
import { getEmailQuotationDraftAction } from '@/actions/EmailActions'
import { isEmpty } from '@/utils/commons'
const EmailQuotation = ({ sfi_sn, ...props }) => {
const {notification} = App.useApp()
const currentConversation = useConversationStore((state) => state.currentConversation)
const { userId, username, emailList, email } = useAuthStore((state) => state.loginUser)
const [orderDetail, customerDetail] = useOrderStore((s) => [s.orderDetail, s.customerDetail])
const emailListOption = emailList?.map((ele) => ({ ...ele, label: ele.email, key: ele.email, value: ele.email })) || []
const emailListAddrMapped = emailListOption?.reduce((r, v) => ({ ...r, [v.email]: v }), {})
const [pickEmail, setPickEmail] = useState({ key: email, email })
useEffect(() => {
const order_opi = Number(orderDetail?.opi_sn || userId)
const find =
emailListOption?.find((ele) => ele.opi_sn === order_opi && ele.default === true) ||
emailListOption?.find((ele) => ele.opi_sn === order_opi && ele.backup === true) ||
emailListOption?.find((ele) => ele.opi_sn === order_opi) ||
emailListOption?.find((ele) => ele.default === true) ||
emailListOption?.find((ele) => ele.backup === true) ||
emailListOption[0]
setPickEmail(find)
return () => {}
}, [orderDetail])
const [draftLoading, setDraftLoading] = useState(false)
const [draft, setDraft] = useState({})
const getEmailDraft = async ({ sfi_sn, coli_sn, lgc = 1 }) => {
if (isEmpty(sfi_sn)) {
return false
}
try {
setDraftLoading(true)
const data = await getEmailQuotationDraftAction({ sfi_sn, coli_sn, lgc })
setDraft(data)
setDraftLoading(false)
} catch (err) {
setDraftLoading(false)
notification.error({
message: '请求失败',
description: err.message || '网络异常',
placement: 'top',
duration: 3,
})
}
}
const [editorOpen, setEditorOpen] = useState(false)
return (
<>
<Button
type='link'
key={'email-now'}
onClick={async () => {
getEmailDraft({ sfi_sn, coli_sn: currentConversation.coli_sn })
setEditorOpen(true)
}}>
邮件
</Button>
<EmailEditorPopup
open={editorOpen}
setOpen={setEditorOpen}
fromEmail={pickEmail.key}
fromUser={orderDetail.opi_sn}
toEmail={currentConversation?.channels?.email || customerDetail?.email}
fromOrder={currentConversation.coli_sn}
conversationid={currentConversation.sn}
// emailMsg={ReferEmailMsg}
// quoteid={mailID}
// initial={{ ...initialPosition, ...initialSize }}
// mailData={mailData}
draft={draft}
action={'new'}
key={`email-quotation-new-popup_${currentConversation.sn}`}
/>
</>
)
}
export default EmailQuotation

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

@ -72,9 +72,9 @@ const generateMailContent = (mailData) => `
* @property {string} toEmail - 收件人邮箱
* @property {string} conversationid - 会话ID
* @property {string} quoteid - 引用邮件ID
* @property {object} quickData - 纯文本输入的草稿. 仅在从快速窗口打开时传递
* @property {object} draft - 草稿
*/
const EmailEditorPopup = ({ open, setOpen, fromEmail, fromUser, fromOrder, toEmail, conversationid, quoteid, initial = {}, mailData: _mailData, action = 'reply', quickData = {}, ...props }) => {
const EmailEditorPopup = ({ open, setOpen, fromEmail, fromUser, fromOrder, toEmail, conversationid, quoteid, initial = {}, mailData: _mailData, action = 'reply', draft = {}, ...props }) => {
const { notification, message } = App.useApp();
const [form] = Form.useForm();
@ -115,7 +115,7 @@ const EmailEditorPopup = ({ open, setOpen, fromEmail, fromUser, fromOrder, toEma
useEffect(() => {
if (isEmpty(quoteid)) {
// console.log('emailEditorPopup effect', open, '\nto', toEmail)
setStickToProps({ fromEmail, fromUser, fromOrder, toEmail, conversationid, quoteid, action });
setStickToProps({ fromEmail, fromUser, fromOrder, toEmail, conversationid, quoteid, action, draft });
setStickToCid(conversationid)
setEmailOrder(fromOrder)
@ -198,7 +198,6 @@ const EmailEditorPopup = ({ open, setOpen, fromEmail, fromUser, fromOrder, toEma
}
const { info, } = mailData
// setShowCc(!isEmpty(mailData.info?.MAI_CS));
setShowCc(true);
const preQuoteBody = generateQuoteContent(mailData);
@ -233,14 +232,14 @@ const EmailEditorPopup = ({ open, setOpen, fromEmail, fromUser, fromOrder, toEma
setInitialContent(thisBody)
} else if (action === 'new') {
const newEmail = { to: newToEmail, subject: quickData?.subject || '' }
const newEmail = { to: newToEmail, subject: draft?.subject || '' }
form.setFieldsValue(newEmail);
setInitialForm(newEmail);
setInitialContent(quickData?.content || '');
setInitialContent(draft?.content || '');
}
return () => {};
}, [stickToProps, mailData.info, newToEmail, newFromEmail]);
}, [stickToProps, mailData.info, draft, newToEmail, newFromEmail]);
const [openPlainTextConfirm, setOpenPlainTextConfirm] = useState(false);
const handlePlainTextOpenChange = ({ target }) => {

@ -1,6 +1,7 @@
import { LinkOutlined } from '@ant-design/icons'
import { Button, Flex, List, Popover } from 'antd'
import { useState } from 'react'
import EmailQuotation from '../Components/EmailQuotation'
const QuotesHistory = ((props) => {
@ -10,14 +11,14 @@ const QuotesHistory = ((props) => {
setOpen(newOpen)
}
const handleCopyClick = (url) => {
const handleCopyClick = (url) => {
navigator.clipboard.writeText(url)
setOpen(false)
}
return (
<>
<Popover
<Popover zIndex={2}
content={
<List
className='w-96 h-4/6 overflow-y-auto text-slate-900'
@ -32,15 +33,18 @@ const QuotesHistory = ((props) => {
<List.Item className='' key={item.letterid} >
<List.Item.Meta
className='text-neutral-800'
title={<a target='_blank' href={item.letterurl}><LinkOutlined />&nbsp;{item.lettertitle}</a>}
title={<a target='_blank' href={item.letterurl} rel='noreferrer'><LinkOutlined />&nbsp;{item.lettertitle}</a>}
description={
<Flex justify='space-between'>
<span>{item.letterdate}</span>
<div>
<EmailQuotation sfi_sn={item.letterid} />
<Button onClick={() => {
handleCopyClick(item.letterurl)
}} size={'small'} type='link' key={'send'}>
复制
</Button>
</div>
</Flex>
}
/>

Loading…
Cancel
Save