退款订单列表增加金额汇总
refundOrder/list 响应增加 totalMoney(单位:分),走 $sum 聚合统计 整个筛选结果的退款金额,而不是当前这一页 —— 按渠道搜出几百笔时 只汇总当页会得出错误金额。 命中数为 0 时直接返回,不再多跑一次聚合和列表查询。 Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
This commit is contained in:
@@ -20,8 +20,9 @@ type RefundOrderListReq struct {
|
|||||||
}
|
}
|
||||||
|
|
||||||
type RefundOrderListResp struct {
|
type RefundOrderListResp struct {
|
||||||
Total int64 `json:"total"`
|
Total int64 `json:"total"`
|
||||||
List refundOrderMod.RefundOrderList `json:"list"`
|
TotalMoney int64 `json:"totalMoney"` // 符合当前筛选条件的共退款金额(单位:分),非仅当前页
|
||||||
|
List refundOrderMod.RefundOrderList `json:"list"`
|
||||||
}
|
}
|
||||||
|
|
||||||
// RefundOrderItem 一笔待回填的订单。
|
// RefundOrderItem 一笔待回填的订单。
|
||||||
|
|||||||
@@ -93,6 +93,29 @@ func CountRefundOrders(ctx context.Context, filter bson.M) (int64, error) {
|
|||||||
return count, nil
|
return count, nil
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// SumRefundOrderMoney 按同一 filter 汇总退款金额(单位:分)。
|
||||||
|
// 走聚合而不是把 money 累加在业务层,是为了统计整个查询结果而不只是当前这一页。
|
||||||
|
func SumRefundOrderMoney(ctx context.Context, filter bson.M) (int64, error) {
|
||||||
|
var ret []struct {
|
||||||
|
TotalMoney int64 `bson:"totalMoney"`
|
||||||
|
}
|
||||||
|
pipeline := []bson.M{
|
||||||
|
{"$match": filter},
|
||||||
|
{"$group": bson.M{
|
||||||
|
"_id": nil,
|
||||||
|
"totalMoney": bson.M{"$sum": "$" + FN.RefundOrder.Money},
|
||||||
|
}},
|
||||||
|
}
|
||||||
|
if err := db.Aggregate(ctx, &ret, pipeline); err != nil {
|
||||||
|
log.Warn("refundOrderMod SumMoney failed", log.E(err), log.Any("filter", filter))
|
||||||
|
return 0, err
|
||||||
|
}
|
||||||
|
if len(ret) == 0 {
|
||||||
|
return 0, nil // 没有命中任何记录
|
||||||
|
}
|
||||||
|
return ret[0].TotalMoney, nil
|
||||||
|
}
|
||||||
|
|
||||||
func DelOneRefundOrder(ctx context.Context, filter bson.M) (int64, error) {
|
func DelOneRefundOrder(ctx context.Context, filter bson.M) (int64, error) {
|
||||||
count, err := db.DeleteOne(ctx, filter)
|
count, err := db.DeleteOne(ctx, filter)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
|
|||||||
@@ -51,6 +51,14 @@ func List(ctx context.Context, req *proto.RefundOrderListReq) (*proto.RefundOrde
|
|||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, err
|
return nil, err
|
||||||
}
|
}
|
||||||
|
if total == 0 {
|
||||||
|
return resp, nil // 没有命中,汇总和列表都不用再查
|
||||||
|
}
|
||||||
|
// 汇总整个筛选结果的退款金额,与分页无关
|
||||||
|
totalMoney, err := refundOrderMod.SumRefundOrderMoney(ctx, filter)
|
||||||
|
if err != nil {
|
||||||
|
return nil, err
|
||||||
|
}
|
||||||
opt := &options.FindOptions{}
|
opt := &options.FindOptions{}
|
||||||
opt.SetSort(bson.D{{Key: refundOrderMod.FN.RefundOrder.CreatedAt, Value: -1}})
|
opt.SetSort(bson.D{{Key: refundOrderMod.FN.RefundOrder.CreatedAt, Value: -1}})
|
||||||
opt.SetSkip((req.PageNum - 1) * req.PageSize)
|
opt.SetSkip((req.PageNum - 1) * req.PageSize)
|
||||||
@@ -60,6 +68,7 @@ func List(ctx context.Context, req *proto.RefundOrderListReq) (*proto.RefundOrde
|
|||||||
return nil, err
|
return nil, err
|
||||||
}
|
}
|
||||||
resp.Total = total
|
resp.Total = total
|
||||||
|
resp.TotalMoney = totalMoney
|
||||||
resp.List = list
|
resp.List = list
|
||||||
return resp, nil
|
return resp, nil
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user