通知日志筛选 + 支付推送按订单所在库处理

后台
- 通知日志页新增筛选:处理结果(成功/失败/已忽略)+ 关键词(事件名、订单号、原始报文)

服务端
- 通知日志接口支持 processed / keyword 过滤
- 支付推送改为「先查生产库、再查开发库」,命中的库即后续写操作的库;
  原先只查小程序当前数据源,数据源一被切换,真实推送就查不到订单
- 去掉「开发库不能退款」的拦截:开发库的单是微信沙箱里真下单产生的,可以正常退
This commit is contained in:
Yeomai committed 2026-10-01 12:09:50 +08:00
1 parent f05a11f0f3
commit 058d677fc1
8 files changed
+172 -60

No files matched your search

@@ -3,7 +3,7 @@
import { useCallback, useEffect, useState } from 'react';
import { api } from '@/lib/api';
import { formatDateTime } from '@/lib/datetime';
import { Button, Card, Empty, Notice } from '@/components/ui';
import { Button, Card, Empty, Input, Notice, Select } from '@/components/ui';
interface NotifyLogRow {
id: number;
@@ -29,22 +29,35 @@ export default function NotifyLogsPage() {
const [items, setItems] = useState<NotifyLogRow[]>([]);
const [total, setTotal] = useState(0);
const [page, setPage] = useState(1);
/** '-1' = 全部结果 */
const [processedFilter, setProcessedFilter] = useState('-1');
const [keyword, setKeyword] = useState('');
const [error, setError] = useState('');
const load = useCallback((nextPage: number) => {
setError('');
api
.listNotifyLogs(nextPage, PAGE_SIZE)
.then((res) => {
setItems(res.items as unknown as NotifyLogRow[]);
setTotal(res.total);
setPage(res.page);
})
.catch((err: { message: string }) => setError(err.message));
}, []);
const load = useCallback(
(nextPage: number, nextKeyword: string) => {
setError('');
api
.listNotifyLogs({
page: nextPage,
pageSize: PAGE_SIZE,
processed: processedFilter === '-1' ? undefined : Number(processedFilter),
keyword: nextKeyword,
})
.then((res) => {
setItems(res.items as unknown as NotifyLogRow[]);
setTotal(res.total);
setPage(res.page);
})
.catch((err: { message: string }) => setError(err.message));
},
[processedFilter],
);
// 筛选一变,load 的引用就变,这里会带着当前关键词回到第 1 页重拉
useEffect(() => {
load(1);
load(1, keyword);
// eslint-disable-next-line react-hooks/exhaustive-deps
}, [load]);
const totalPages = Math.max(1, Math.ceil(total / PAGE_SIZE));
@@ -60,7 +73,29 @@ export default function NotifyLogsPage() {
<Notice message={error} />
<Card>
<div className="mb-4 text-sm text-gray-500">共 {total} 条通知</div>
<div className="mb-4 flex flex-wrap items-center justify-between gap-2">
<div className="text-sm text-gray-500">共 {total} 条通知</div>
<div className="flex items-center gap-2">
<div className="w-32">
<Select
value={processedFilter}
onChange={setProcessedFilter}
options={[
{ value: -1, label: '全部结果' },
{ value: 1, label: '成功' },
{ value: 2, label: '失败' },
{ value: 0, label: '已忽略' },
]}
/>
</div>
<div className="w-60">
<Input value={keyword} onChange={setKeyword} placeholder="事件名 / 订单号 / 说明…" />
</div>
<Button variant="ghost" onClick={() => load(1, keyword)}>
搜索
</Button>
</div>
</div>
{items.length === 0 ? (
<Empty />
@@ -110,10 +145,10 @@ export default function NotifyLogsPage() {
第 {page} / {totalPages} 页
</span>
<div className="flex gap-2">
<Button variant="ghost" disabled={page <= 1} onClick={() => load(page - 1)}>
<Button variant="ghost" disabled={page <= 1} onClick={() => load(page - 1, keyword)}>
上一页
</Button>
<Button variant="ghost" disabled={page >= totalPages} onClick={() => load(page + 1)}>
<Button variant="ghost" disabled={page >= totalPages} onClick={() => load(page + 1, keyword)}>
下一页
</Button>
</div>