From d5a522e88f27d4015126dbf27d3654e8874d8e5b Mon Sep 17 00:00:00 2001 From: LiaoYijun Date: Wed, 25 Jun 2025 14:06:37 +0800 Subject: [PATCH] =?UTF-8?q?feat:=20=E5=A2=9E=E5=8A=A0=E3=80=90=E6=9F=A5?= =?UTF-8?q?=E6=89=BE=E9=82=AE=E4=BB=B6=E3=80=91=E7=95=8C=E9=9D=A2?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/actions/EmailActions.js | 10 +++ src/hooks/useEmail.js | 16 +++- src/views/orders/components/MailBox.jsx | 67 +++------------ .../orders/components/MailListSearchModal.jsx | 82 +++++++++++++++++++ .../components/MailOrderSearchModal.jsx | 2 +- 5 files changed, 119 insertions(+), 58 deletions(-) create mode 100644 src/views/orders/components/MailListSearchModal.jsx diff --git a/src/actions/EmailActions.js b/src/actions/EmailActions.js index 1a61f75..420a10e 100644 --- a/src/actions/EmailActions.js +++ b/src/actions/EmailActions.js @@ -375,6 +375,16 @@ export const queryEmailListAction = async ({ opi_sn = '', pagesize = 10, last_id return ret; } +export const searchEmailListAction = async (opi_sn = '', mailboxtype = 'ALL', sender = '', receiver = '', subject = '') => { + + const formData = new FormData() + formData.append('opi_sn', opi_sn) + formData.append('mailboxtype', mailboxtype) + const { errcode, result } = await postForm(`${API_HOST_V3}/mail_search`, formData) + const ret = errcode === 0 ? result : [] + return ret; +} + const removeFromCurrentList = async (params) => { const readRow0 = await readIndexDB(params.mai_sn_list[0], 'listrow', 'mailbox') const listKey = readRow0?.data?.listKey || '' diff --git a/src/hooks/useEmail.js b/src/hooks/useEmail.js index 892ef4c..1cac63a 100644 --- a/src/hooks/useEmail.js +++ b/src/hooks/useEmail.js @@ -1,7 +1,7 @@ import { useState, useEffect, useCallback } from 'react' import { isEmpty, objectMapper, olog, } from '@/utils/commons' import { readIndexDB } from '@/utils/indexedDB' -import { getEmailDetailAction, postResendEmailAction, getSalesSignatureAction, getEmailOrderAction, queryEmailListAction, getReminderEmailTemplateAction, saveEmailDraftOrSendAction, updateEmailAction, getEmailChangesChannel, EMAIL_CHANNEL_NAME } from '@/actions/EmailActions' +import { getEmailDetailAction, postResendEmailAction, getSalesSignatureAction, getEmailOrderAction, queryEmailListAction, searchEmailListAction, getReminderEmailTemplateAction, saveEmailDraftOrSendAction, updateEmailAction, getEmailChangesChannel, EMAIL_CHANNEL_NAME } from '@/actions/EmailActions' import { App } from 'antd' import useConversationStore from '@/stores/ConversationStore'; import { msgStatusRenderMapped } from '@/channel/bubbleMsgUtils'; @@ -176,6 +176,7 @@ export const useEmailList = (mailboxDirNode) => { setRefreshTrigger((prev) => prev + 1) }, []) + const [currentMailboxOPI] = useConversationStore((state) => [state.currentMailboxOPI]) const { OPI_SN: opi_sn, COLI_SN, VKey, VParent, ApplyDate, OrderSourceType, IsTrue } = mailboxDirNode const markAsRead = useCallback( @@ -233,6 +234,17 @@ export const useEmailList = (mailboxDirNode) => { } }, [VKey]) + const searchMailList = async () => { + const searchResult = await searchEmailListAction(currentMailboxOPI, 'ALL') + // 配合List的结构 + const mailList = searchResult.map((ele) => ({ + ...ele, + key: ele.MAI_SN, + })) + setMailList(mailList) + console.info('searchMailList', searchResult) + } + const getMailList = useCallback(async () => { // console.log('getMailList', mailboxDirNode) if (!opi_sn || !VKey || (!IsTrue && !COLI_SN)) { @@ -297,7 +309,7 @@ export const useEmailList = (mailboxDirNode) => { } }, [getMailList]) - return { loading, isFreshData, error, mailList, refresh, markAsRead, markAsProcessed, markAsDeleted } + return { loading, isFreshData, error, mailList, refresh, markAsRead, markAsProcessed, markAsDeleted, searchMailList } } const orderMailTypes = new Map([ diff --git a/src/views/orders/components/MailBox.jsx b/src/views/orders/components/MailBox.jsx index 176e904..cf52c95 100644 --- a/src/views/orders/components/MailBox.jsx +++ b/src/views/orders/components/MailBox.jsx @@ -1,48 +1,21 @@ import { useEffect, useState } from 'react' import { ReloadOutlined, ReadOutlined, RightOutlined, LeftOutlined, SearchOutlined, MailOutlined, DeleteOutlined } from '@ant-design/icons' import { Flex, Button, Tooltip, List, Form, Row, Col, Input, Checkbox, DatePicker, Switch, Breadcrumb, Skeleton, Popconfirm } from 'antd' -import dayjs from 'dayjs' import { useEmailList } from '@/hooks/useEmail' import { isEmpty } from '@/utils/commons' import { MailboxDirIcon } from './MailboxDirIcon' import { AttachmentIcon, MailCheckIcon, MailOpenIcon } from '@/components/Icons' import NewEmailButton from './NewEmailButton' import MailOrderSearchModal from './MailOrderSearchModal' +import MailListSearchModal from './MailListSearchModal' -const { RangePicker } = DatePicker const PAGE_SIZE = 50 // 每页显示条数 const MailBox = ({ mailboxDir, onMailItemClick, ...props }) => { - 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 [form] = Form.useForm() + const [selectedItems, setSelectedItems] = useState([]) - const { mailList, loading, error, refresh, markAsRead, markAsProcessed, markAsDeleted } = useEmailList(mailboxDir) + const { mailList, loading, error, refresh, markAsRead, markAsProcessed, markAsDeleted, searchMailList } = useEmailList(mailboxDir) const [pagination, setPagination] = useState({ current: 1, @@ -189,33 +162,17 @@ const MailBox = ({ mailboxDir, onMailItemClick, ...props }) => { 删除 + + {/* */} -
-
- - - - - - - - - - - - - - - -
-
{ diff --git a/src/views/orders/components/MailListSearchModal.jsx b/src/views/orders/components/MailListSearchModal.jsx new file mode 100644 index 0000000..3f300e7 --- /dev/null +++ b/src/views/orders/components/MailListSearchModal.jsx @@ -0,0 +1,82 @@ +import { createContext, useEffect, useState } from 'react' +import { ReloadOutlined, ReadOutlined, RightOutlined, LeftOutlined, SearchOutlined, MailOutlined } from '@ant-design/icons' +import { Button, Modal, Form, Input, Checkbox, Select, Radio, Segmented, Divider, Typography, Flex } from 'antd' +import dayjs from 'dayjs' +import { getEmailDirAction, queryHTOrderListAction, searchEmailListAction } from '@/actions/EmailActions' +import { isEmpty, objectMapper, pick } from '@/utils/commons' +import useConversationStore from '@/stores/ConversationStore' +import { useEmailList } from '@/hooks/useEmail' + +const MailListSearchModal = ({ ...props }) => { + const [currentMailboxOPI] = useConversationStore((state) => [state.currentMailboxOPI]) + const { searchMailList } = useEmailList(props.mailboxDir) + + const [openForm, setOpenForm] = useState(false) + const [formSearch] = Form.useForm() + const [loading, setLoading] = useState(false) + + const onSubmitSearchMailList = async (values) => { + setLoading(true) + searchMailList() + setLoading(false) + setOpenForm(false) + } + return ( + <> + + setOpenForm(false)} + footer={null} + destroyOnHidden + modalRender={(dom) => ( +
onSubmitSearchMailList(values)} + className='[&_.ant-form-item]:m-2'> + {dom} +
+ )}> + + + + + + + + + + + + + +
+ + ) +} +export default MailListSearchModal diff --git a/src/views/orders/components/MailOrderSearchModal.jsx b/src/views/orders/components/MailOrderSearchModal.jsx index 76cef9e..558fb91 100644 --- a/src/views/orders/components/MailOrderSearchModal.jsx +++ b/src/views/orders/components/MailOrderSearchModal.jsx @@ -60,7 +60,7 @@ const MailOrderSearchModal = ({ ...props }) => { return ( <>