doge před 18 hodinami
rodič
revize
baed079ae6

+ 2 - 3
app/Http/Controllers/admin/Funds.php

@@ -17,9 +17,8 @@ class Funds extends Controller
                 'start_date' => ['nullable', 'date_format:Y-m-d', 'required_with:end_date'],
                 'end_date' => ['nullable', 'date_format:Y-m-d', 'required_with:start_date', 'after_or_equal:start_date'],
             ]);
-            $today = date('Y-m-d');
-            $startDate = $params['start_date'] ?? $today;
-            $endDate = $params['end_date'] ?? $today;
+            $startDate = $params['start_date'] ?? null;
+            $endDate = $params['end_date'] ?? null;
 
             return $this->success(FundsSummaryService::summary($startDate, $endDate));
         } catch (ValidationException $e) {

+ 36 - 25
app/Services/FundsSummaryService.php

@@ -7,9 +7,11 @@ use Illuminate\Support\Facades\DB;
 
 class FundsSummaryService
 {
-    public static function summary(string $startDate, string $endDate): array
+    public static function summary(?string $startDate = null, ?string $endDate = null): array
     {
-        [$start, $end] = self::dateRange($startDate, $endDate);
+        [$start, $end] = $startDate !== null && $endDate !== null
+            ? self::dateRange($startDate, $endDate)
+            : [null, null];
         $balance = self::balanceAggregates($start, $end);
         $withdraw = self::withdrawAggregates($start, $end);
         $paymentOrder = self::paymentOrderAggregates($start, $end);
@@ -79,15 +81,16 @@ class FundsSummaryService
         ];
     }
 
-    private static function balanceAggregates(Carbon $start, Carbon $end): object
+    private static function balanceAggregates(?Carbon $start, ?Carbon $end): object
     {
-        return DB::table('balance_logs')
-            ->whereBetween('created_at', [$start, $end])
+        $query = DB::table('balance_logs')
             ->whereIn('change_type', [
                 '充值', '三方充值', '人工充值', '人工扣款',
                 '比比返', '笔笔返', '返水', '回水',
                 '注册赠送', '优惠活动', '即充即送', '充值返现', '老用户回归',
-            ])
+            ]);
+
+        return self::applyDateRange($query, 'created_at', $start, $end)
             ->selectRaw(<<<'SQL'
                 COALESCE(SUM(CASE
                     WHEN change_type = '充值' AND amount > 0 THEN amount ELSE 0 END), 0
@@ -132,7 +135,7 @@ class FundsSummaryService
             ->first();
     }
 
-    private static function withdrawAggregates(Carbon $start, Carbon $end): object
+    private static function withdrawAggregates(?Carbon $start, ?Carbon $end): object
     {
         $balanceLogAlias = self::rawAlias('bl');
         $withdrawAlias = self::rawAlias('w');
@@ -151,16 +154,17 @@ class FundsSummaryService
             ->first();
     }
 
-    private static function paymentOrderAggregates(Carbon $start, Carbon $end): object
+    private static function paymentOrderAggregates(?Carbon $start, ?Carbon $end): object
     {
         $pay = PaymentOrderService::TYPE_PAY;
         $payout = PaymentOrderService::TYPE_PAYOUT;
         $manualPayout = PaymentOrderService::TYPE_SELF_PAYOUT;
 
-        return DB::table('payment_orders')
+        $query = DB::table('payment_orders')
             ->where('status', PaymentOrderService::STATUS_SUCCESS)
-            ->whereIn('type', [$pay, $payout, $manualPayout])
-            ->whereBetween('created_at', [$start, $end])
+            ->whereIn('type', [$pay, $payout, $manualPayout]);
+
+        return self::applyDateRange($query, 'created_at', $start, $end)
             ->selectRaw(<<<SQL
                 COALESCE(SUM(CASE WHEN type = {$pay} AND fee > 0 THEN fee ELSE 0 END), 0)
                     AS third_party_fee_amount,
@@ -187,29 +191,26 @@ class FundsSummaryService
      *
      * @return array{member_withdraw_deduction:int, manual_withdrawal:int}
      */
-    private static function combinedPeople(Carbon $start, Carbon $end): array
+    private static function combinedPeople(?Carbon $start, ?Carbon $end): array
     {
         $withdrawFees = self::successfulWithdrawLogs($start, $end)
             ->where('w.service_charge', '>', 0)
             ->selectRaw("'member_withdraw_deduction' AS category")
             ->addSelect('bl.member_id as member_id');
-        $manualPayoutFees = DB::table('payment_orders as po')
+        $manualPayoutFees = self::applyDateRange(DB::table('payment_orders as po')
             ->where('po.type', PaymentOrderService::TYPE_SELF_PAYOUT)
             ->where('po.status', PaymentOrderService::STATUS_SUCCESS)
-            ->where('po.fee', '>', 0)
-            ->whereBetween('po.created_at', [$start, $end])
+            ->where('po.fee', '>', 0), 'po.created_at', $start, $end)
             ->selectRaw("'member_withdraw_deduction' AS category")
             ->addSelect('po.member_id as member_id');
-        $manualDebits = DB::table('balance_logs as bl')
+        $manualDebits = self::applyDateRange(DB::table('balance_logs as bl')
             ->where('bl.change_type', '人工扣款')
-            ->where('bl.amount', '<', 0)
-            ->whereBetween('bl.created_at', [$start, $end])
+            ->where('bl.amount', '<', 0), 'bl.created_at', $start, $end)
             ->selectRaw("'manual_withdrawal' AS category")
             ->addSelect('bl.member_id as member_id');
-        $manualPayouts = DB::table('payment_orders as po')
+        $manualPayouts = self::applyDateRange(DB::table('payment_orders as po')
             ->where('po.type', PaymentOrderService::TYPE_SELF_PAYOUT)
-            ->where('po.status', PaymentOrderService::STATUS_SUCCESS)
-            ->whereBetween('po.created_at', [$start, $end])
+            ->where('po.status', PaymentOrderService::STATUS_SUCCESS), 'po.created_at', $start, $end)
             ->selectRaw("'manual_withdrawal' AS category")
             ->addSelect('po.member_id as member_id');
 
@@ -236,14 +237,24 @@ class FundsSummaryService
         return $result;
     }
 
-    private static function successfulWithdrawLogs(Carbon $start, Carbon $end)
+    private static function successfulWithdrawLogs(?Carbon $start, ?Carbon $end)
     {
-        return DB::table('balance_logs as bl')
+        $query = DB::table('balance_logs as bl')
             ->join('withdraws as w', 'w.id', '=', 'bl.related_id')
             ->where('w.status', 1)
             ->where('bl.change_type', '提现')
-            ->where('bl.amount', '<', 0)
-            ->whereBetween('bl.created_at', [$start, $end]);
+            ->where('bl.amount', '<', 0);
+
+        return self::applyDateRange($query, 'bl.created_at', $start, $end);
+    }
+
+    private static function applyDateRange($query, string $column, ?Carbon $start, ?Carbon $end)
+    {
+        if ($start !== null && $end !== null) {
+            $query->whereBetween($column, [$start, $end]);
+        }
+
+        return $query;
     }
 
     private static function rawAlias(string $alias): string

+ 4 - 2
docs/admin-finance-api.md

@@ -16,8 +16,8 @@ POST 请求使用 `Content-Type: application/json`。统一响应:`code = 0` 
 
 | 参数 | 必填 | 说明 |
 | --- | --- | --- |
-| `start_date` | 否 | 开始日期,`Y-m-d`;与 `end_date` 同时传,不传时默认今天 |
-| `end_date` | 否 | 结束日期,`Y-m-d`;与 `start_date` 同时传,不传时默认今天 |
+| `start_date` | 否 | 开始日期,`Y-m-d`;与 `end_date` 同时传,不传时查询全部 |
+| `end_date` | 否 | 结束日期,`Y-m-d`;与 `start_date` 同时传,不传时查询全部 |
 
 返回:
 
@@ -51,6 +51,8 @@ POST 请求使用 `Content-Type: application/json`。统一响应:`code = 0` 
 
 前端直接遍历 `income`、`expense`。每项固定返回 `key`、`label`、`amount`、`people`。
 
+不传日期时统计全部历史数据,返回的 `start_date`、`end_date` 均为 `null`。
+
 汇总金额统一按钱包余额单位统计;USDT 会员出款使用订单实际扣减的钱包金额。
 
 当前库没有独立的 VIP 折扣流水,因此 `vip_discount` 固定返回 `0.00 / 0人`。