Update API endpoints for order retrieval in admin panel; change from /api/orders to /api/admin/orders in multiple files for consistency. Remove unused CSS and JS files from the distribution folder to streamline the build. Enhance order synchronization logic in the backend to handle order states more effectively.
This commit is contained in:
@@ -8,6 +8,7 @@ import (
|
||||
"os"
|
||||
"path/filepath"
|
||||
"strconv"
|
||||
"strings"
|
||||
"sync"
|
||||
"time"
|
||||
|
||||
@@ -69,10 +70,53 @@ func RunSyncOrders(ctx context.Context, days int) (synced, total int, err error)
|
||||
}
|
||||
tradeState, transactionID, totalFee, qerr := wechat.QueryOrderByOutTradeNo(ctx, o.OrderSN)
|
||||
if qerr != nil {
|
||||
// 微信返回「订单不存在」:说明该 out_trade_no 在微信侧已无效,直接将本地订单标记为关闭
|
||||
if strings.Contains(qerr.Error(), "ORDER_NOT_EXIST") {
|
||||
now := time.Now()
|
||||
if err := db.Model(&o).Updates(map[string]interface{}{
|
||||
"status": "closed",
|
||||
"updated_at": now,
|
||||
}).Error; err != nil {
|
||||
syncOrdersLogf("微信提示订单不存在,标记订单 %s 为关闭失败: %v", o.OrderSN, err)
|
||||
} else {
|
||||
syncOrdersLogf("微信提示订单不存在,已将本地订单标记为关闭: %s", o.OrderSN)
|
||||
}
|
||||
continue
|
||||
}
|
||||
syncOrdersLogf("查询订单 %s 失败: %v", o.OrderSN, qerr)
|
||||
continue
|
||||
}
|
||||
// 根据微信支付状态决定本地订单后续处理:
|
||||
// - SUCCESS:补齐漏单,发放权益
|
||||
// - NOTPAY/USERPAYING:在有效期内保持 created,超过一定时间自动标记为关闭
|
||||
// - 其他终态(CLOSED、REVOKED、PAYERROR 等):标记为关闭,避免无限轮询
|
||||
if tradeState != "SUCCESS" {
|
||||
// 对仍未支付的订单设置超时关闭(避免长时间轮询)
|
||||
if tradeState == "NOTPAY" || tradeState == "USERPAYING" {
|
||||
// 超过 30 分钟仍未支付,视为关闭
|
||||
if time.Since(o.CreatedAt) > 30*time.Minute {
|
||||
now := time.Now()
|
||||
if err := db.Model(&o).Updates(map[string]interface{}{
|
||||
"status": "closed",
|
||||
"updated_at": now,
|
||||
}).Error; err != nil {
|
||||
syncOrdersLogf("标记超时未支付订单 %s 为关闭失败: %v", o.OrderSN, err)
|
||||
} else {
|
||||
syncOrdersLogf("订单超时未支付,标记为关闭: %s", o.OrderSN)
|
||||
}
|
||||
}
|
||||
continue
|
||||
}
|
||||
// 其他非 SUCCESS 状态(如 CLOSED、REVOKED、PAYERROR 等),直接在本地标记为关闭
|
||||
now := time.Now()
|
||||
if err := db.Model(&o).Updates(map[string]interface{}{
|
||||
"status": "closed",
|
||||
"updated_at": now,
|
||||
}).Error; err != nil {
|
||||
syncOrdersLogf("标记订单 %s 为关闭状态失败(trade_state=%s): %v", o.OrderSN, tradeState, err)
|
||||
} else {
|
||||
syncOrdersLogf("订单在微信已为终态 %s,本地标记为关闭: %s", tradeState, o.OrderSN)
|
||||
}
|
||||
continue
|
||||
}
|
||||
// 微信已支付,本地未更新 → 补齐
|
||||
|
||||
@@ -70,8 +70,12 @@ func DBMatchRecordsList(c *gin.Context) {
|
||||
|
||||
userIDs := make(map[string]bool)
|
||||
for _, r := range records {
|
||||
userIDs[r.UserID] = true
|
||||
userIDs[r.MatchedUserID] = true
|
||||
if r.UserID != "" {
|
||||
userIDs[r.UserID] = true
|
||||
}
|
||||
if r.MatchedUserID != "" {
|
||||
userIDs[r.MatchedUserID] = true
|
||||
}
|
||||
}
|
||||
ids := make([]string, 0, len(userIDs))
|
||||
for id := range userIDs {
|
||||
@@ -105,11 +109,19 @@ func DBMatchRecordsList(c *gin.Context) {
|
||||
if mu != nil && mu.Avatar != nil {
|
||||
matchedUserAvatar = *mu.Avatar
|
||||
}
|
||||
userNickname := ""
|
||||
if u != nil {
|
||||
userNickname = getStr(u.Nickname)
|
||||
}
|
||||
matchedNickname := ""
|
||||
if mu != nil {
|
||||
matchedNickname = getStr(mu.Nickname)
|
||||
}
|
||||
out = append(out, gin.H{
|
||||
"id": r.ID, "userId": r.UserID, "matchedUserId": r.MatchedUserID,
|
||||
"matchType": r.MatchType, "phone": getStr(r.Phone), "wechatId": getStr(r.WechatID),
|
||||
"userNickname": getStr(u.Nickname),
|
||||
"matchedNickname": getStr(mu.Nickname),
|
||||
"userNickname": userNickname,
|
||||
"matchedNickname": matchedNickname,
|
||||
"userAvatar": userAvatar,
|
||||
"matchedUserAvatar": matchedUserAvatar,
|
||||
"matchScore": r.MatchScore,
|
||||
|
||||
Reference in New Issue
Block a user