diff --git a/api/proto/refundOrder.go b/api/proto/refundOrder.go index 728cb5c..ca19b0d 100644 --- a/api/proto/refundOrder.go +++ b/api/proto/refundOrder.go @@ -20,8 +20,9 @@ type RefundOrderListReq struct { } type RefundOrderListResp struct { - Total int64 `json:"total"` - List refundOrderMod.RefundOrderList `json:"list"` + Total int64 `json:"total"` + TotalMoney int64 `json:"totalMoney"` // 符合当前筛选条件的共退款金额(单位:分),非仅当前页 + List refundOrderMod.RefundOrderList `json:"list"` } // RefundOrderItem 一笔待回填的订单。 diff --git a/models/refundOrderMod/refund.go b/models/refundOrderMod/refund.go index 480885c..0a95abe 100644 --- a/models/refundOrderMod/refund.go +++ b/models/refundOrderMod/refund.go @@ -93,6 +93,29 @@ func CountRefundOrders(ctx context.Context, filter bson.M) (int64, error) { 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) { count, err := db.DeleteOne(ctx, filter) if err != nil { diff --git a/service/refundOrderSer/refund.go b/service/refundOrderSer/refund.go index 589af7c..8c1623d 100644 --- a/service/refundOrderSer/refund.go +++ b/service/refundOrderSer/refund.go @@ -51,6 +51,14 @@ func List(ctx context.Context, req *proto.RefundOrderListReq) (*proto.RefundOrde if err != nil { 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.SetSort(bson.D{{Key: refundOrderMod.FN.RefundOrder.CreatedAt, Value: -1}}) opt.SetSkip((req.PageNum - 1) * req.PageSize) @@ -60,6 +68,7 @@ func List(ctx context.Context, req *proto.RefundOrderListReq) (*proto.RefundOrde return nil, err } resp.Total = total + resp.TotalMoney = totalMoney resp.List = list return resp, nil }