Răsfoiți Sursa

修复app和站内信部分搜索与分页问题 还有app的阅读接口未调用问题

pm 2 luni în urmă
părinte
comite
b1de62e853

+ 11 - 0
src/api/notification/app_message.ts

@@ -44,4 +44,15 @@ export const app_message = {
   getMyPage: (params?: NotifyMessageQueryParams): Promise<PageResponse<NotifyMessageVO>> => {
     return axiosInstance.get('/system/app-notify-message/my-page', { params });
   },
+
+  // 标记消息为已读
+  updateRead: (ids: number[]): Promise<void> => {
+    const idsParam = ids.join(',');
+    return axiosInstance.put(`/system/app-notify-message/update-read?ids=${idsParam}`);
+  },
+
+  // 全部标记为已读
+  updateAllRead: (): Promise<void> => {
+    return axiosInstance.put('/system/app-notify-message/update-all-read');
+  },
 };

+ 41 - 4
src/components/AppMessage.tsx

@@ -203,14 +203,27 @@ export default function AppMessage() {
     });
   };
 
-  // 查看详情
+  // 查看详情(点击阅读时若未读先调用 update-read 再展示详情)
   const handleViewDetail = async (id: number) => {
+    const currentMessage = messages.find(msg => msg.id === id);
+    const isUnread = currentMessage?.status === 'unread';
+
+    if (isUnread) {
+      try {
+        await app_message.updateRead([id]);
+        await fetchMessages();
+        window.dispatchEvent(new CustomEvent('messageRead'));
+      } catch (error: any) {
+        console.error('标记已读失败:', error);
+        toast.error(error?.response?.data?.message || t('notificationManagement.markReadFailed'));
+        return;
+      }
+    }
+
     setDetailLoading(true);
     try {
-      // 获取消息详情(这里假设有详情接口,如果没有可以只显示列表中的数据)
-      const currentMessage = messages.find(msg => msg.id === id);
       if (currentMessage) {
-        setDetailMessage(currentMessage);
+        setDetailMessage(isUnread ? { ...currentMessage, status: 'read' as const } : currentMessage);
         setDetailModalVisible(true);
       } else {
         toast.error(t('notificationManagement.messageDetailNotFound'));
@@ -223,6 +236,23 @@ export default function AppMessage() {
     }
   };
 
+  // 全部已读
+  const handleMarkAllAsRead = async () => {
+    setLoading(true);
+    try {
+      await app_message.updateAllRead();
+      setSelectedIds([]);
+      await fetchMessages();
+      toast.success(t('notificationManagement.markAllReadSuccess'));
+      window.dispatchEvent(new CustomEvent('messageRead'));
+    } catch (error: any) {
+      console.error('全部标记已读失败:', error);
+      toast.error(error?.response?.data?.message || t('notificationManagement.markAllReadFailed'));
+    } finally {
+      setLoading(false);
+    }
+  };
+
   // 使用从API获取的消息列表(已根据筛选条件过滤)
   const filteredMessages = messages;
 
@@ -445,6 +475,13 @@ export default function AppMessage() {
               >
                 {t('common.reset')}
               </AntButton>
+              <AntButton
+                icon={<BookOpen className="w-4 h-4" />}
+                onClick={handleMarkAllAsRead}
+                disabled={loading}
+              >
+                {t('notificationManagement.markAllRead')}
+              </AntButton>
             </Space>
           </div>
         </div>

+ 12 - 15
src/components/InboxMessage.tsx

@@ -83,7 +83,7 @@ export default function InboxMessage() {
     };
   };
 
-  // 获取消息列表
+  // 获取消息列表(若调用方传入 searchParams 的某字段,则优先用传入值,包括 undefined 表示清空该条件)
   const fetchMessages = async (searchParams?: {
     title?: string;
     status?: string;
@@ -93,12 +93,12 @@ export default function InboxMessage() {
   }) => {
     setLoading(true);
     try {
-      // 使用传入的参数或当前状态
-      const title = searchParams?.title !== undefined ? searchParams.title : messageTitle;
-      const status = searchParams?.status !== undefined ? searchParams.status : messageStatus;
-      const start = searchParams?.startDate !== undefined ? searchParams.startDate : startDate;
-      const end = searchParams?.endDate !== undefined ? searchParams.endDate : endDate;
-      const page = searchParams?.page !== undefined ? searchParams.page : currentPage;
+      const has = (key: string) => searchParams && key in searchParams;
+      const title = has('title') ? searchParams!.title : messageTitle;
+      const status = has('status') ? searchParams!.status : messageStatus;
+      const start = has('startDate') ? searchParams!.startDate : startDate;
+      const end = has('endDate') ? searchParams!.endDate : endDate;
+      const page = has('page') ? searchParams!.page : currentPage;
 
       const params: any = {
         pageNo: page,
@@ -210,22 +210,19 @@ export default function InboxMessage() {
     });
   };
 
-  // 重置
-  const handleReset = () => {
+  // 重置:清空筛选条件并立即用空条件重新拉取列表
+  const handleReset = async () => {
     // 标记为搜索触发,避免 useEffect 重复调用
     isSearchingRef.current = true;
-    // 先清空搜索条件和表格数据
+    // 清空筛选条件
     setMessageTitle('');
     setMessageStatus(undefined);
     setStartDate(null);
     setEndDate(null);
     setSelectedIds([]);
     setCurrentPage(1);
-    // 先清空表格数据,确保界面立即更新
-    setMessages([]);
-    setTotal(0);
-    // 重置后重新获取数据(使用空条件,确保传入所有参数)
-    fetchMessages({
+    // 使用空条件重新拉取列表(显式传参,不依赖 state),并等待完成以保证列表刷新
+    await fetchMessages({
       title: '',
       status: undefined,
       startDate: null,