init: hgmj server initial commit
Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
This commit is contained in:
@@ -0,0 +1,65 @@
|
||||
package rechargeser
|
||||
|
||||
import (
|
||||
"91jd-server/models/commod"
|
||||
"91jd-server/models/v/advanceordermod"
|
||||
"91jd-server/models/v/productmod"
|
||||
"time"
|
||||
|
||||
"go.mongodb.org/mongo-driver/bson"
|
||||
"go.mongodb.org/mongo-driver/bson/primitive"
|
||||
"go.mongodb.org/mongo-driver/mongo/options"
|
||||
)
|
||||
|
||||
// applyAdvanceDisplay changes response-only prices after a successful deposit.
|
||||
// Checkout still loads the original product and order from the database.
|
||||
func applyAdvanceDisplay(uid uint64, products []productmod.Product, now time.Time) error {
|
||||
if uid == 0 {
|
||||
return nil
|
||||
}
|
||||
ids := make([]primitive.ObjectID, 0)
|
||||
for _, p := range products {
|
||||
if balanceCardEligible(p, now) {
|
||||
ids = append(ids, p.ID)
|
||||
}
|
||||
}
|
||||
if len(ids) == 0 {
|
||||
return nil
|
||||
}
|
||||
orders, err := advanceordermod.QueryAllDocument(bson.M{
|
||||
"uid": uid, "productID": bson.M{"$in": ids},
|
||||
"status": bson.M{"$in": []int{advanceordermod.AdvanceSUCCESS, advanceordermod.BalanceProcessing}},
|
||||
"endTime": bson.M{"$gt": now},
|
||||
}, options.Find().SetLimit(int64(len(ids))).SetMaxTime(3*time.Second).
|
||||
SetProjection(bson.M{"productID": 1, "_id": 0}))
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
pending := make(map[primitive.ObjectID]bool, len(orders))
|
||||
for _, order := range orders {
|
||||
pending[order.ProductID] = true
|
||||
}
|
||||
for i := range products {
|
||||
if pending[products[i].ID] && balanceCardEligible(products[i], now) {
|
||||
setBalanceDisplay(&products[i])
|
||||
}
|
||||
}
|
||||
return nil
|
||||
}
|
||||
|
||||
func balanceCardEligible(p productmod.Product, now time.Time) bool {
|
||||
return p.ProductType == commod.AdvanceCard && p.BalanceAmount > 0 &&
|
||||
!now.Before(p.StartTime) && now.Before(p.EndTime)
|
||||
}
|
||||
|
||||
func setBalanceDisplay(p *productmod.Product) {
|
||||
price := p.BalanceAmount
|
||||
// Compact cards read advanceAmount when their presale context is absent.
|
||||
// Like upgrade pricing, normalize this response field, not stored amounts.
|
||||
p.AdvanceAmount = price
|
||||
p.DiscountedPrice, p.DiscountedPriceIos, p.DiscountedPriceAnd = price, &price, &price
|
||||
p.IsUpgrade = false
|
||||
if p.EndBGImg != "" {
|
||||
p.BGImg = p.EndBGImg
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user