fix: require balance for automatic task claims

This commit is contained in:
richjohnrambo
2026-10-15 16:40:39 +08:00
parent acf50b9b7c
commit 05d6ec26ad
3 changed files with 17 additions and 2 deletions
+1 -1
View File
@@ -205,7 +205,7 @@ func (s *Store) ClaimTask(ctx context.Context, input ClaimTaskInput) (*TaskOrder
if wallet.Status != 1 { if wallet.Status != 1 {
return nil, ErrAccountRestricted return nil, ErrAccountRestricted
} }
if member.AutoDispatch == 1 && wallet.AvailableAmount < input.MinimumAmount { if member.AutoDispatch == 1 && (wallet.AvailableAmount <= 0 || wallet.AvailableAmount < input.MinimumAmount) {
return nil, ErrInsufficientBalance return nil, ErrInsufficientBalance
} }
var pending int64 var pending int64
+1 -1
View File
@@ -206,7 +206,7 @@ func (s *Service) Eligibility(ctx context.Context, tenantID, memberID, hallID in
result.reject("LEVEL_NOT_ELIGIBLE", "当前等级不能进入该任务大厅") result.reject("LEVEL_NOT_ELIGIBLE", "当前等级不能进入该任务大厅")
case row.WalletStatus != 1: case row.WalletStatus != 1:
result.reject("ACCOUNT_RESTRICTED", "账户状态受限") result.reject("ACCOUNT_RESTRICTED", "账户状态受限")
case row.AutoDispatch == 1 && row.AvailableAmount < policy.MinimumAmount: case row.AutoDispatch == 1 && (row.AvailableAmount <= 0 || row.AvailableAmount < policy.MinimumAmount):
result.reject("INSUFFICIENT_BALANCE", "可用余额不足") result.reject("INSUFFICIENT_BALANCE", "可用余额不足")
case row.DailyLimit > 0 && row.TodayCount >= row.DailyLimit: case row.DailyLimit > 0 && row.TodayCount >= row.DailyLimit:
result.reject("DAILY_LIMIT_REACHED", "已达当日领取上限") result.reject("DAILY_LIMIT_REACHED", "已达当日领取上限")
+15
View File
@@ -92,6 +92,21 @@ func TestEligibilityAllowsManualDispatchBelowMinimumBalance(t *testing.T) {
} }
} }
func TestEligibilityRejectsAutoDispatchWithZeroBalanceWhenMinimumIsZero(t *testing.T) {
repository := &fakeRepository{config: json.RawMessage(`{"features":{"task_enabled":true},"task_minimum_amount":0,"task_business_start_at":"09:00","task_business_end_at":"22:00"}`),
eligibility: &store.TaskEligibility{MemberStatus: 1, AutoDispatch: 1, HallEligible: true, AvailableAmount: 0, WalletStatus: 1, DailyLimit: 5}}
service := New(repository)
service.now = func() time.Time { return time.Date(2026, 10, 9, 10, 0, 0, 0, shanghai) }
result, err := service.Eligibility(context.Background(), 0, 10, 1)
if err != nil {
t.Fatal(err)
}
if result.Eligible || result.Reason != "INSUFFICIENT_BALANCE" {
t.Fatalf("zero balance must not allow automatic claiming: %#v", result)
}
}
func TestClaimFailsClosedWithoutTaskSwitch(t *testing.T) { func TestClaimFailsClosedWithoutTaskSwitch(t *testing.T) {
repository := &fakeRepository{config: json.RawMessage(`{}`)} repository := &fakeRepository{config: json.RawMessage(`{}`)}
service := New(repository) service := New(repository)