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:
Alex-larget
2026-03-11 16:29:20 +08:00
parent 3d8873fe24
commit da6d2c0852
14 changed files with 1565 additions and 832 deletions

View File

@@ -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
}
// 微信已支付,本地未更新 → 补齐

View File

@@ -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,