Skip to content

Commit 9e885d8

Browse files
committed
order notify
1 parent 74c3a3a commit 9e885d8

2 files changed

Lines changed: 92 additions & 1 deletion

File tree

src/model/service/task_service.go

Lines changed: 13 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -450,6 +450,18 @@ func TryProcessEvmERC20Transfer(chainNetwork string, contract common.Address, to
450450
}
451451

452452
func sendPaymentNotification(order *mdb.Orders) {
453+
if order == nil {
454+
return
455+
}
456+
if strings.TrimSpace(order.TradeId) != "" {
457+
latest, err := data.GetOrderInfoByTradeId(order.TradeId)
458+
if err != nil {
459+
log.Sugar.Warnf("[notify] reload order failed trade_id=%s err=%v", order.TradeId, err)
460+
} else if latest != nil && latest.TradeId != "" {
461+
order = latest
462+
}
463+
}
464+
453465
msg := fmt.Sprintf(
454466
"🎉 <b>收款成功通知</b>\n\n"+
455467
"💰 <b>金额信息</b>\n"+
@@ -472,7 +484,7 @@ func sendPaymentNotification(order *mdb.Orders) {
472484
networkDisplay(order.Network),
473485
order.ReceiveAddress,
474486
order.CreatedAt.ToDateTimeString(),
475-
carbon.Now().ToDateTimeString(),
487+
order.UpdatedAt.ToDateTimeString(),
476488
)
477489
notify.Dispatch(mdb.NotifyEventPaySuccess, msg)
478490
}
Lines changed: 79 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,79 @@
1+
package service
2+
3+
import (
4+
"strings"
5+
"testing"
6+
"time"
7+
8+
"github.com/GMWalletApp/epusdt/internal/testutil"
9+
"github.com/GMWalletApp/epusdt/model/dao"
10+
"github.com/GMWalletApp/epusdt/model/mdb"
11+
"github.com/GMWalletApp/epusdt/notify"
12+
)
13+
14+
func TestSendPaymentNotificationUsesLatestOrderUpdatedAt(t *testing.T) {
15+
cleanup := testutil.SetupTestDatabases(t)
16+
defer cleanup()
17+
18+
const channelType = "test-pay-success-time"
19+
got := make(chan string, 1)
20+
notify.RegisterSender(channelType, func(config, text string) error {
21+
got <- text
22+
return nil
23+
})
24+
25+
if err := dao.Mdb.Create(&mdb.NotificationChannel{
26+
Type: channelType,
27+
Name: "test",
28+
Config: "{}",
29+
Events: `{"pay_success":true}`,
30+
Enabled: true,
31+
}).Error; err != nil {
32+
t.Fatalf("seed notification channel: %v", err)
33+
}
34+
35+
order := &mdb.Orders{
36+
TradeId: "T202604270001",
37+
OrderId: "ORD202604270001",
38+
Amount: 100,
39+
Currency: "cny",
40+
ActualAmount: 14.28,
41+
Token: "USDT",
42+
Network: mdb.NetworkTron,
43+
ReceiveAddress: "TTestAddress",
44+
Status: mdb.StatusWaitPay,
45+
}
46+
if err := dao.Mdb.Create(order).Error; err != nil {
47+
t.Fatalf("seed order: %v", err)
48+
}
49+
50+
const createdAt = "2026-04-27 09:00:00"
51+
const staleUpdatedAt = "2026-04-27 09:01:00"
52+
const paidAt = "2026-04-27 10:20:30"
53+
if err := dao.Mdb.Exec("UPDATE orders SET created_at = ?, updated_at = ? WHERE trade_id = ?", createdAt, staleUpdatedAt, order.TradeId).Error; err != nil {
54+
t.Fatalf("set initial timestamps: %v", err)
55+
}
56+
57+
var staleOrderModel mdb.Orders
58+
if err := dao.Mdb.Where("trade_id = ?", order.TradeId).Take(&staleOrderModel).Error; err != nil {
59+
t.Fatalf("load stale order: %v", err)
60+
}
61+
62+
if err := dao.Mdb.Exec("UPDATE orders SET status = ?, updated_at = ? WHERE trade_id = ?", mdb.StatusPaySuccess, paidAt, order.TradeId).Error; err != nil {
63+
t.Fatalf("set paid timestamp: %v", err)
64+
}
65+
66+
sendPaymentNotification(&staleOrderModel)
67+
68+
select {
69+
case text := <-got:
70+
if !strings.Contains(text, "支付时间:"+paidAt) {
71+
t.Fatalf("notification payment time = %q, want %s", text, paidAt)
72+
}
73+
if strings.Contains(text, "支付时间:"+staleUpdatedAt) {
74+
t.Fatalf("notification used stale payment time: %q", text)
75+
}
76+
case <-time.After(2 * time.Second):
77+
t.Fatal("timed out waiting for notification")
78+
}
79+
}

0 commit comments

Comments
 (0)