|
|
@@ -43,6 +43,15 @@ class AdminListAccountTest extends TestCase
|
|
|
$t->id(); $t->string('member_id'); $t->string('date'); $t->integer('status')->default(0);
|
|
|
$t->decimal('amount', 20, 2)->default(0); $t->decimal('granted_amount', 20, 2)->default(0); $t->timestamps();
|
|
|
});
|
|
|
+ $schema->create('backflow_rules', function (Blueprint $t) {
|
|
|
+ $t->id(); $t->string('category'); $t->decimal('min_loss_amount', 20, 2); $t->decimal('reward_amount', 20, 2);
|
|
|
+ $t->decimal('turnover_multiple', 20, 2)->default(0);
|
|
|
+ });
|
|
|
+ $schema->create('share_bet_facts', function (Blueprint $t) {
|
|
|
+ $t->id(); $t->unsignedBigInteger('user_id'); $t->string('category'); $t->date('bet_date'); $t->dateTime('bet_at');
|
|
|
+ $t->decimal('bet_amount', 24, 10); $t->decimal('effective_amount', 24, 10); $t->decimal('net_profit', 24, 10);
|
|
|
+ $t->boolean('voided')->default(false); $t->string('currency')->default('CNY');
|
|
|
+ });
|
|
|
$schema->create('recharges', function (Blueprint $t) {
|
|
|
$t->id(); $t->string('member_id'); $t->string('coin')->default('CNY'); $t->decimal('amount', 20, 2)->default(0);
|
|
|
$t->integer('status')->default(0); $t->timestamps();
|
|
|
@@ -100,29 +109,38 @@ class AdminListAccountTest extends TestCase
|
|
|
$this->assertSame(['m2' => 'bob'], $this->accounts(BackflowService::paginate(['limit' => 10, 'account' => 'bo'])['data']));
|
|
|
}
|
|
|
|
|
|
- public function test_backflow_list_shows_granted_pending_and_whether_more_can_be_granted(): void
|
|
|
+ public function test_backflow_list_recalculates_unpaid_rows_with_current_rules_and_shows_granted_and_pending(): void
|
|
|
{
|
|
|
\Carbon\Carbon::setTestNow(\Carbon\Carbon::parse('2026-11-05 15:00:00', 'Asia/Shanghai'));
|
|
|
try {
|
|
|
+ DB::table('backflow_rules')->insert([
|
|
|
+ ['category' => 'self:lottery', 'min_loss_amount' => 10, 'reward_amount' => 8],
|
|
|
+ ['category' => 'self:lottery', 'min_loss_amount' => 300, 'reward_amount' => 50],
|
|
|
+ ]);
|
|
|
+ foreach ([1 => '-50', 2 => '-350', 3 => '-50'] as $userId => $profit) {
|
|
|
+ DB::table('share_bet_facts')->insert(['user_id' => $userId, 'category' => 'self:lottery', 'bet_date' => '2026-11-03',
|
|
|
+ 'bet_at' => '2026-11-03 12:00:00', 'bet_amount' => 100, 'effective_amount' => 100, 'net_profit' => $profit]);
|
|
|
+ }
|
|
|
+ // 存储的 amount=20 是旧规则算出的过期值;列表应按当前规则显示
|
|
|
DB::table('backflow')->insert([
|
|
|
- ['member_id' => 'm1', 'date' => '2026-11', 'status' => 0, 'amount' => 8, 'granted_amount' => 0], // 当月未发
|
|
|
- ['member_id' => 'm2', 'date' => '2026-11', 'status' => 2, 'amount' => 50, 'granted_amount' => 8], // 当月部分发放,可补发
|
|
|
- ['member_id' => 'm3', 'date' => '2026-11', 'status' => 2, 'amount' => 8, 'granted_amount' => 8], // 当月已发完,暂无差额
|
|
|
- ['member_id' => 'm1', 'date' => '2026-10', 'status' => 0, 'amount' => 0, 'granted_amount' => 0], // 往月未结清
|
|
|
- ['member_id' => 'm2', 'date' => '2026-10', 'status' => 1, 'amount' => 35, 'granted_amount' => 35], // 已发放
|
|
|
+ ['member_id' => 'm1', 'date' => '2026-11', 'status' => 0, 'amount' => 20, 'granted_amount' => 0], // 当月未发:应发 8
|
|
|
+ ['member_id' => 'm2', 'date' => '2026-11', 'status' => 2, 'amount' => 20, 'granted_amount' => 8], // 部分发放:应发 50,待发 42
|
|
|
+ ['member_id' => 'm3', 'date' => '2026-11', 'status' => 2, 'amount' => 20, 'granted_amount' => 8], // 已发完:旧值会误显示待发 12
|
|
|
+ ['member_id' => 'm1', 'date' => '2026-10', 'status' => 0, 'amount' => 5, 'granted_amount' => 0], // 往月无注单:应发 0,可点发放结清
|
|
|
+ ['member_id' => 'm2', 'date' => '2026-10', 'status' => 1, 'amount' => 35, 'granted_amount' => 35], // 已发放:保留存储值
|
|
|
['member_id' => 'm1', 'date' => '2026-12', 'status' => 0, 'amount' => 0, 'granted_amount' => 0], // 未来月份不展示
|
|
|
]);
|
|
|
$rows = [];
|
|
|
foreach (json_decode(json_encode(BackflowService::paginate(['limit' => 10])['data']), true) as $row) {
|
|
|
- $rows[$row['member_id'] . '|' . $row['date']] = [$row['granted_amount'], $row['pending_amount'], $row['can_grant'], $row['status_text']];
|
|
|
+ $rows[$row['member_id'] . '|' . $row['date']] = [$row['amount'], $row['granted_amount'], $row['pending_amount'], $row['can_grant'], $row['status_text']];
|
|
|
}
|
|
|
ksort($rows);
|
|
|
$this->assertSame([
|
|
|
- 'm1|2026-10' => ['0.00', '0.00', true, '未发放'],
|
|
|
- 'm1|2026-11' => ['0.00', '8.00', true, '未发放'],
|
|
|
- 'm2|2026-10' => ['35.00', '0.00', false, '已发放'],
|
|
|
- 'm2|2026-11' => ['8.00', '42.00', true, '部分发放'],
|
|
|
- 'm3|2026-11' => ['8.00', '0.00', false, '部分发放'],
|
|
|
+ 'm1|2026-10' => ['0.00', '0.00', '0.00', true, '未发放'],
|
|
|
+ 'm1|2026-11' => ['8.00', '0.00', '8.00', true, '未发放'],
|
|
|
+ 'm2|2026-10' => ['35.00', '35.00', '0.00', false, '已发放'],
|
|
|
+ 'm2|2026-11' => ['50.00', '8.00', '42.00', true, '部分发放'],
|
|
|
+ 'm3|2026-11' => ['8.00', '8.00', '0.00', false, '部分发放'],
|
|
|
], $rows);
|
|
|
$this->assertSame(2, BackflowService::paginate(['limit' => 10, 'status' => 2])['total']);
|
|
|
} finally {
|