fix(invitation): 邀请返利改用实际结算利润并修正提号基准
This commit is contained in:
@@ -369,6 +369,14 @@ func (r *Repository) processOrderInvitationRebate(ctx context.Context, tx *gorm.
|
||||
orderGrossProfitCent := order.RentAmountCent - order.OwnerRentAmountCent
|
||||
if opts.GrossProfitCent != nil {
|
||||
orderGrossProfitCent = *opts.GrossProfitCent
|
||||
} else {
|
||||
// 正常结账、仲裁等终态都已落定实际结账单;未显式传基数时优先按实际平台利润,
|
||||
// 避免再次用订单创建时的预收毛利快照给零消耗结账发返利。
|
||||
var committedCheckout model.OrderCheckout
|
||||
if err := tx.Where("order_id = ? AND status IN ?", order.ID, []string{"accepted", "settled"}).
|
||||
Order("id DESC").First(&committedCheckout).Error; err == nil {
|
||||
orderGrossProfitCent = committedCheckout.PlatformFeeCent
|
||||
}
|
||||
}
|
||||
if orderGrossProfitCent <= 0 {
|
||||
return nil
|
||||
|
||||
@@ -20,6 +20,7 @@ func setupTestDB(t *testing.T) *gorm.DB {
|
||||
&model.InvitationRebateConfig{},
|
||||
&model.InvitationRebateLedger{},
|
||||
&model.RentalOrder{},
|
||||
&model.OrderCheckout{},
|
||||
&model.DistributionSite{},
|
||||
&model.DistributionOrderParty{},
|
||||
&model.WalletAccount{},
|
||||
@@ -262,6 +263,57 @@ func TestProcessOrderInvitationRebateUsesActualProfitBasis(t *testing.T) {
|
||||
}
|
||||
}
|
||||
|
||||
func TestProcessOrderInvitationRebateFallsBackToCommittedCheckoutProfit(t *testing.T) {
|
||||
db := setupTestDB(t)
|
||||
inviter := model.User{Phone: "13800000021", RealnameStatus: "verified", Status: "active"}
|
||||
if err := db.Create(&inviter).Error; err != nil {
|
||||
t.Fatalf("创建邀请人失败: %v", err)
|
||||
}
|
||||
seller := model.User{Phone: "13800000022", RealnameStatus: "verified", Status: "active"}
|
||||
if err := db.Create(&seller).Error; err != nil {
|
||||
t.Fatalf("创建卖家失败: %v", err)
|
||||
}
|
||||
verifiedAt := time.Now().AddDate(0, 0, -2).Truncate(time.Second)
|
||||
if err := db.Create(&model.UserInvitation{
|
||||
InviterID: inviter.ID, InviteeID: seller.ID, Status: StatusActive, VerifiedAt: &verifiedAt,
|
||||
}).Error; err != nil {
|
||||
t.Fatalf("创建邀请关系失败: %v", err)
|
||||
}
|
||||
order := model.RentalOrder{
|
||||
OrderNo: fmt.Sprintf("ORD-COMMITTED-%d", time.Now().UnixNano()),
|
||||
OwnerID: seller.ID,
|
||||
RenterID: 99999,
|
||||
Status: "completed",
|
||||
SettlementStatus: "settled",
|
||||
RentAmountCent: 10000,
|
||||
OwnerRentAmountCent: 8000,
|
||||
}
|
||||
if err := db.Create(&order).Error; err != nil {
|
||||
t.Fatalf("创建订单失败: %v", err)
|
||||
}
|
||||
if err := db.Create(&model.OrderCheckout{
|
||||
OrderID: order.ID,
|
||||
Status: "accepted",
|
||||
RentAmountCent: 2000,
|
||||
OwnerRentAmountCent: 1700,
|
||||
PlatformFeeCent: 300,
|
||||
}).Error; err != nil {
|
||||
t.Fatalf("创建已确认结账单失败: %v", err)
|
||||
}
|
||||
|
||||
if err := NewRepository(db).ProcessOrderInvitationRebate(t.Context(), db, order.ID); err != nil {
|
||||
t.Fatalf("返利处理失败: %v", err)
|
||||
}
|
||||
var ledger model.InvitationRebateLedger
|
||||
if err := db.Where("order_id = ? AND trade_role = 'seller'", order.ID).First(&ledger).Error; err != nil {
|
||||
t.Fatalf("查询返利流水失败: %v", err)
|
||||
}
|
||||
if ledger.OrderProfitBasisCent != 300 || ledger.SingleSideBasisCent != 150 || ledger.RebateAmountCent != 90 {
|
||||
t.Fatalf("返利基数/单边/金额 = %d/%d/%d, want 300/150/90",
|
||||
ledger.OrderProfitBasisCent, ledger.SingleSideBasisCent, ledger.RebateAmountCent)
|
||||
}
|
||||
}
|
||||
|
||||
func TestCrossSiteDistributionRebate(t *testing.T) {
|
||||
db := setupTestDB(t)
|
||||
repo := NewRepository(db)
|
||||
|
||||
Reference in New Issue
Block a user