import { fetchJSON, postForm, postJSON } from '@/utils/request'; import { API_HOST, DATE_FORMAT, DATEEND_FORMAT, DATETIME_FORMAT, EMAIL_HOST } from '@/config'; import { buildTree, isEmpty, objectMapper, omitEmpty, readIndexDB, uniqWith, writeIndexDB } from '@/utils/commons'; import dayjs from 'dayjs'; const parseHTMLString = (html, needText = false) => { const parser = new DOMParser() const doc = parser.parseFromString(html, 'text/html') let bodyContent = doc.body.innerHTML // bodyContent = bodyContent.replace(/ { try { const { result } = await fetchJSON(`${EMAIL_HOST}/email_sign`, params) const { SignContent: html } = result const bodyContent = parseHTMLString(html); return bodyContent; } catch (error) { return ''; } }; /** * 发送邮件 */ export const postSendEmail = async (body) => { const { attaList=[], atta, content, ...bodyData } = body; bodyData.ordertype = 227001; const formData = new FormData(); Object.keys(bodyData).forEach(function (key) { formData.append(key, bodyData[key]); }); attaList.forEach(function (item) { formData.append('attachment', item); }); const { result } = await postForm(`${EMAIL_HOST}/sendmail`, formData); return result; }; /** * 重发邮件 * @param {object} { mai_sn } */ export const postResendEmailAction = async (body) => { const { attaList, atta, content, ...bodyData } = body; const formData = new FormData(); Object.keys(bodyData).forEach(function (key) { formData.append(key, bodyData[key]); }); return await postForm(`${EMAIL_HOST}/email_resend`, formData); }; const encodeEmailInfo = (info) => { const encodeQuote = (str = '') => str.replace(/"/g, ''); //.replace(//g,'>') const CSsClean = encodeQuote(info.MAI_CS).includes(',') ? encodeQuote(info.MAI_CS).split(',') : encodeQuote(info.MAI_CS).split(';'); const tosClean = (encodeQuote(info.MAI_To).includes(',') ? encodeQuote(info.MAI_To).split(',') : encodeQuote(info.MAI_To).split(';')).concat(CSsClean).filter(s => s); const replyTo = info.MAI_Direction === 1 ? info.MAI_To : info.MAI_From; const replyToAll = (tosClean.length > 1) ? (info.MAI_Direction === 1 ? tosClean.join(',') : [...tosClean, info.MAI_From].join(',')) : (info.MAI_Direction === 1 ? info.MAI_To : info.MAI_From) return { ...info, MAI_From: encodeQuote(info.MAI_From), MAI_To: encodeQuote(info.MAI_To), tos: [...new Set(tosClean)], replyToAll, replyTo, } }; /** * 邮件详情 * @param {object} { mai_sn } */ export const getEmailDetailAction = async (params) => { // const cacheKey = params.mai_sn; // const readCache = await readIndexDB(cacheKey, 'mailinfo', 'mailbox'); // if (!isEmpty(readCache)) { // todo: 除了草稿 // return readCache.data; // } const { result } = await fetchJSON(`${EMAIL_HOST}/getmail`, params); let mailType = result.MailInfo?.[0]?.MAI_ContentType || ''; mailType = mailType === '' && (result.MailContent||'').includes('' : '')); const { html, bodyContent, bodyText } = mailType === 'text/html' ? parseHTMLString(cleanContent, true) : { html: '', bodyContent: '', bodyText: '' }; const attachments = (isEmpty(result?.AttachList) ? [] : result.AttachList).filter(ele => isEmpty(ele.ATI_ContentID)); const ret = { info: { ...encodeEmailInfo(result.MailInfo?.[0] || {}), mailType }, content: mailType === 'text/html' ? html : result.MailContent || '', abstract: bodyText || result.MailContent || '', attachments, } // writeIndexDB([{key: cacheKey, data: ret}], 'mailinfo', 'mailbox') return ret; } 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, } */ export const getEmailFetchAction = async (params) => { const { opi_sn, } = params const { result } = await fetchJSON(`${EMAIL_HOST}/email_fetch`, { opi_sn, }) return result }; /** * 报价信邮件草稿 * @param {object} { sfi_sn, coli_sn, lgc } */ export const getEmailQuotationDraftAction = async (params) => { const { result } = await fetchJSON(`${EMAIL_HOST}/QuotationLetter`, params) return { subject: (result.Subject || ''), content: parseHTMLString((result.MailContent || '').replace(/\r\n/g, '')) } } /** * 单个邮件绑定订单 * @param {object} { conversationid, mai_sn, coli_sn, coli_id, sourcetype } */ export const fetchEmailBindOrderAction = async (params) => { const { errcode, result } = await fetchJSON(`${API_HOST}/mailinfo_bindorder`, params) return errcode === 0 ? true : false; } /** * 顾问的邮箱目录 * @param {object} { opi_sn } */ export const getEmailDirAction = async (params = { opi_sn: '' }) => { const defaultParams = { opi_sn: 0, year: dayjs().year(), by_start_date: 1, by_success: -1, important: -1, if_want_book: -1, if_thinking: -1 } const { errcode, result } = await fetchJSON(`http://202.103.68.144:8889/v3/email_dir`, { ...defaultParams, ...params }) return errcode === 0 ? result : []; } ; /** * 获取邮件列表 * @usage 邮件目录下的邮件列表 * @usage 订单的邮件列表 * @usage 高级搜索 */ export const queryEmailListAction = async ({ opi_sn = '', pagesize = 10, last_id = '', node = {}, } = {}) => { const _params = { vkey: 0, vparent: 0, order_source_type: 0, mai_senddate1: dayjs().subtract(1, 'year').startOf('year').format(DATE_FORMAT), mai_senddate2: dayjs().format(DATEEND_FORMAT), ...omitEmpty({ ...node, opi_sn, }), } _params.mai_senddate1 = dayjs(_params.mai_senddate1).format(DATE_FORMAT) const cacheKey = isEmpty(_params.coli_sn) ? `dir-${node.vkey}` : `order-${node.vkey}`; const { errcode, result } = await fetchJSON(`http://202.103.68.144:8889/v3/mail_list`, _params) const ret = errcode === 0 ? result : [] if (!isEmpty(ret)) { writeIndexDB([{key: cacheKey, data: ret}], 'maillist', 'mailbox') } return ret; } /** * 更新邮件属性 */ export const updateEmailAction = async (params = { mai_sn_list: [], set: {} }) => { const { errcode, result } = await postJSON(`${EMAIL_HOST}/email/update`, params) return errcode === 0 ? {} : result } /** * 获取邮件模板 */ export const getEmailTemplateAction = async (template_name, params = { coli_sn: 0, lgc: 1 }) => { const { errcode, result } = await fetchJSON(`${EMAIL_HOST}/email/template/${template_name}`, params) return errcode === 0 ? {} : result } /** * 保存邮件草稿 */ export const saveEmailDraftAction = async (body) => { const { attaList=[], atta, content, ...bodyData } = body; bodyData.ordertype = 227001; const formData = new FormData(); Object.keys(bodyData).forEach(function (key) { formData.append(key, bodyData[key]); }); attaList.forEach(function (item) { formData.append('attachment', item); }); const { result } = await postForm(`${EMAIL_HOST}/email-draft/save`, formData); return result; }; /** * 删除邮件草稿 */ export const deleteEmailDraftAction = async (id) => { const { errcode, result } = await postJSON(`${EMAIL_HOST}/email-draft/delete`, { id }) return errcode === 0 ? {} : result };