70 lines
2.5 KiB
Go
70 lines
2.5 KiB
Go
package rchgordmod
|
|
|
|
import (
|
|
"go.mongodb.org/mongo-driver/bson"
|
|
"go.mongodb.org/mongo-driver/bson/primitive"
|
|
)
|
|
|
|
type VIPExperimentOrderStat struct {
|
|
Variant string `json:"variant" bson:"variant"`
|
|
ProductID primitive.ObjectID `json:"productId" bson:"productId"`
|
|
CreatedOrders int `json:"createdOrders" bson:"createdOrders"`
|
|
PaidOrders int `json:"paidOrders" bson:"paidOrders"`
|
|
RefundedOrders int `json:"refundedOrders" bson:"refundedOrders"`
|
|
OrderAmount int64 `json:"orderAmount" bson:"orderAmount"`
|
|
PaidAmount int64 `json:"paidAmount" bson:"paidAmount"`
|
|
GoldPaidOrders int `json:"goldPaidOrders" bson:"goldPaidOrders"`
|
|
GoldPaidAmount int64 `json:"goldPaidAmount" bson:"goldPaidAmount"`
|
|
}
|
|
|
|
func VIPExperimentOrderStatistics(experimentID string) ([]VIPExperimentOrderStat, error) {
|
|
var raw []struct {
|
|
ID struct {
|
|
Variant string `bson:"variant"`
|
|
ProductID primitive.ObjectID `bson:"productId"`
|
|
} `bson:"_id"`
|
|
CreatedOrders int `bson:"createdOrders"`
|
|
PaidOrders int `bson:"paidOrders"`
|
|
RefundedOrders int `bson:"refundedOrders"`
|
|
OrderAmount int64 `bson:"orderAmount"`
|
|
PaidAmount int64 `bson:"paidAmount"`
|
|
}
|
|
err := coll(nil).Aggregate(&raw, []bson.M{
|
|
{"$match": bson.M{"experimentId": experimentID}},
|
|
{"$group": bson.M{
|
|
"_id": bson.M{
|
|
"variant": "$experimentVariant",
|
|
"productId": "$productID",
|
|
},
|
|
"createdOrders": bson.M{"$sum": 1},
|
|
"paidOrders": bson.M{"$sum": bson.M{"$cond": bson.A{
|
|
bson.M{"$eq": bson.A{"$status", SUCCESS}}, 1, 0,
|
|
}}},
|
|
"refundedOrders": bson.M{"$sum": bson.M{"$cond": bson.A{
|
|
bson.M{"$eq": bson.A{"$status", REFUND}}, 1, 0,
|
|
}}},
|
|
"orderAmount": bson.M{"$sum": "$money"},
|
|
"paidAmount": bson.M{"$sum": bson.M{"$cond": bson.A{
|
|
bson.M{"$eq": bson.A{"$status", SUCCESS}}, "$payMoney", 0,
|
|
}}},
|
|
}},
|
|
{"$sort": bson.D{{Key: "_id.variant", Value: 1}, {Key: "createdOrders", Value: -1}}},
|
|
})
|
|
if err != nil {
|
|
return nil, err
|
|
}
|
|
result := make([]VIPExperimentOrderStat, 0, len(raw))
|
|
for _, item := range raw {
|
|
result = append(result, VIPExperimentOrderStat{
|
|
Variant: item.ID.Variant,
|
|
ProductID: item.ID.ProductID,
|
|
CreatedOrders: item.CreatedOrders,
|
|
PaidOrders: item.PaidOrders,
|
|
RefundedOrders: item.RefundedOrders,
|
|
OrderAmount: item.OrderAmount,
|
|
PaidAmount: item.PaidAmount,
|
|
})
|
|
}
|
|
return result, nil
|
|
}
|