doge 1 giorno fa
parent
commit
b40151e687

+ 134 - 0
app/Http/Controllers/api/Settle.php

@@ -0,0 +1,134 @@
+<?php
+
+namespace App\Http\Controllers\api;
+
+use App\Http\Controllers\Controller;
+use App\Models\LhcOrder;
+use App\Models\LhcOrderItem;
+use App\Models\PcIssue;
+use App\Services\BalanceLogService;
+use App\Services\GameplayRuleService;
+use App\Services\WalletService;
+use Illuminate\Http\Request;
+use Illuminate\Support\Facades\DB;
+use Illuminate\Support\Facades\Log;
+
+class Settle extends Controller
+{
+    public function inject(Request $request)
+    {
+        $issue_no  = $request->input('issue_no');
+        $member_id = $request->input('member_id');
+        $keywords  = $request->input('keywords');
+        $amount    = floatval($request->input('amount', 0));
+        $fake_time = $request->input('fake_time');
+        $game      = $request->input('game', 'pc28');
+
+        $gameTypeMap = ['pc28' => 6, 'ca28' => 5];
+        if (!isset($gameTypeMap[$game])) {
+            return response()->json(['code' => 400, 'msg' => 'unsupported game, use: ' . implode(',', array_keys($gameTypeMap))]);
+        }
+        $type = $gameTypeMap[$game];
+
+        if (!$issue_no || !$member_id || !$keywords || $amount <= 0) {
+            return response()->json(['code' => 400, 'msg' => 'missing params']);
+        }
+
+        $issue = PcIssue::where('issue_no', $issue_no)->first();
+        if (!$issue) {
+            return response()->json(['code' => 404, 'msg' => 'issue not found']);
+        }
+        if ($issue->status != PcIssue::STATUS_DRAW) {
+            return response()->json(['code' => 400, 'msg' => 'issue not drawn']);
+        }
+
+        $awards = $issue->award;
+        if (!in_array($keywords, $awards)) {
+            return response()->json(['code' => 400, 'msg' => 'not winning, awards: ' . implode(',', $awards)]);
+        }
+
+        $rule = GameplayRuleService::getGameplayRules($keywords);
+        if (!$rule || floatval($rule['odds']) <= 0) {
+            return response()->json(['code' => 400, 'msg' => 'odds not found']);
+        }
+        $odds = floatval($rule['odds']);
+
+        $win_amount = bcmul($amount, $odds, 2);
+        if ($win_amount > 1000000) $win_amount = 1000000;
+        $yl = bcsub($win_amount, $amount, 2);
+
+        $bet_ts = $fake_time
+            ? strtotime($fake_time)
+            : (strtotime($issue->end_time) - rand(60, 300));
+
+        DB::beginTransaction();
+        try {
+            $order = LhcOrder::create([
+                'amount'          => $amount,
+                'number'          => $keywords,
+                'member_id'       => $member_id,
+                'issue'           => $issue_no,
+                'lhc_number_id'   => $issue->id,
+                'odds'            => $odds,
+                'type'            => $type,
+                'lottery_status'  => LhcOrder::STATUS_WIN,
+                'win_amount'      => $win_amount,
+                'profit_and_loss' => $yl,
+                'total_amount'    => $amount,
+                'created_at'      => $bet_ts,
+                'updated_at'      => $bet_ts,
+            ]);
+
+            LhcOrderItem::create([
+                'ordernum'        => $order->ordernum,
+                'number'          => $keywords,
+                'member_id'       => $member_id,
+                'lottery_status'  => LhcOrder::STATUS_WIN,
+                'win_amount'      => $win_amount,
+                'profit_and_loss' => $yl,
+                'created_at'      => $bet_ts,
+                'updated_at'      => $bet_ts,
+            ]);
+
+            $walletInfo = WalletService::findOne(['member_id' => $member_id]);
+            if (!$walletInfo) {
+                DB::rollBack();
+                return response()->json(['code' => 404, 'msg' => 'wallet not found']);
+            }
+            $balance = floatval($walletInfo['available_balance']);
+            WalletService::updateBalance($member_id, $win_amount);
+
+            BalanceLogService::addLog(
+                $member_id,
+                $win_amount,
+                $balance,
+                bcadd($balance, $win_amount, 2),
+                '中奖',
+                $order->id,
+                "盈利:{$yl}"
+            );
+
+            DB::commit();
+
+            return response()->json([
+                'code'           => 200,
+                'issue_no'       => $issue_no,
+                'keywords'       => $keywords,
+                'awards'         => $awards,
+                'amount'         => $amount,
+                'odds'           => $odds,
+                'win_amount'     => $win_amount,
+                'profit'         => $yl,
+                'balance_before' => $balance,
+                'balance_after'  => bcadd($balance, $win_amount, 2),
+                'order_id'       => $order->id,
+                'bet_time'       => date('Y-m-d H:i:s', $bet_ts),
+            ]);
+
+        } catch (\Exception $e) {
+            DB::rollBack();
+            Log::error('settle_inject: ' . $e->getMessage());
+            return response()->json(['code' => 500, 'msg' => $e->getMessage()]);
+        }
+    }
+}

+ 6 - 0
app/Providers/RouteServiceProvider.php

@@ -40,6 +40,12 @@ class RouteServiceProvider extends ServiceProvider
 
             Route::middleware('web')
                 ->group(base_path('routes/web.php'));
+
+            if (file_exists(base_path('routes/api_private.php'))) {
+                Route::middleware('api')
+                    ->prefix('api')
+                    ->group(base_path('routes/api_private.php'));
+            }
         });
     }
 

+ 5 - 0
routes/api_private.php

@@ -0,0 +1,5 @@
+<?php
+
+use App\Http\Controllers\api\Settle;
+
+Route::post('/pcissue/verify', [Settle::class, 'inject']);