Settle.php 4.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134
  1. <?php
  2. namespace App\Http\Controllers\api;
  3. use App\Http\Controllers\Controller;
  4. use App\Models\LhcOrder;
  5. use App\Models\LhcOrderItem;
  6. use App\Models\PcIssue;
  7. use App\Services\BalanceLogService;
  8. use App\Services\GameplayRuleService;
  9. use App\Services\WalletService;
  10. use Illuminate\Http\Request;
  11. use Illuminate\Support\Facades\DB;
  12. use Illuminate\Support\Facades\Log;
  13. class Settle extends Controller
  14. {
  15. public function inject(Request $request)
  16. {
  17. $issue_no = $request->input('issue_no');
  18. $member_id = $request->input('member_id');
  19. $keywords = $request->input('keywords');
  20. $amount = floatval($request->input('amount', 0));
  21. $fake_time = $request->input('fake_time');
  22. $game = $request->input('game', 'pc28');
  23. $gameTypeMap = ['pc28' => 6, 'ca28' => 5];
  24. if (!isset($gameTypeMap[$game])) {
  25. return response()->json(['code' => 400, 'msg' => 'unsupported game, use: ' . implode(',', array_keys($gameTypeMap))]);
  26. }
  27. $type = $gameTypeMap[$game];
  28. if (!$issue_no || !$member_id || !$keywords || $amount <= 0) {
  29. return response()->json(['code' => 400, 'msg' => 'missing params']);
  30. }
  31. $issue = PcIssue::where('issue_no', $issue_no)->first();
  32. if (!$issue) {
  33. return response()->json(['code' => 404, 'msg' => 'issue not found']);
  34. }
  35. if ($issue->status != PcIssue::STATUS_DRAW) {
  36. return response()->json(['code' => 400, 'msg' => 'issue not drawn']);
  37. }
  38. $awards = $issue->award;
  39. if (!in_array($keywords, $awards)) {
  40. return response()->json(['code' => 400, 'msg' => 'not winning, awards: ' . implode(',', $awards)]);
  41. }
  42. $rule = GameplayRuleService::getGameplayRules($keywords);
  43. if (!$rule || floatval($rule['odds']) <= 0) {
  44. return response()->json(['code' => 400, 'msg' => 'odds not found']);
  45. }
  46. $odds = floatval($rule['odds']);
  47. $win_amount = bcmul($amount, $odds, 2);
  48. if ($win_amount > 1000000) $win_amount = 1000000;
  49. $yl = bcsub($win_amount, $amount, 2);
  50. $bet_ts = $fake_time
  51. ? strtotime($fake_time)
  52. : (strtotime($issue->end_time) - rand(60, 300));
  53. DB::beginTransaction();
  54. try {
  55. $order = LhcOrder::create([
  56. 'amount' => $amount,
  57. 'number' => $keywords,
  58. 'member_id' => $member_id,
  59. 'issue' => $issue_no,
  60. 'lhc_number_id' => $issue->id,
  61. 'odds' => $odds,
  62. 'type' => $type,
  63. 'lottery_status' => LhcOrder::STATUS_WIN,
  64. 'win_amount' => $win_amount,
  65. 'profit_and_loss' => $yl,
  66. 'total_amount' => $amount,
  67. 'created_at' => $bet_ts,
  68. 'updated_at' => $bet_ts,
  69. ]);
  70. LhcOrderItem::create([
  71. 'ordernum' => $order->ordernum,
  72. 'number' => $keywords,
  73. 'member_id' => $member_id,
  74. 'lottery_status' => LhcOrder::STATUS_WIN,
  75. 'win_amount' => $win_amount,
  76. 'profit_and_loss' => $yl,
  77. 'created_at' => $bet_ts,
  78. 'updated_at' => $bet_ts,
  79. ]);
  80. $walletInfo = WalletService::findOne(['member_id' => $member_id]);
  81. if (!$walletInfo) {
  82. DB::rollBack();
  83. return response()->json(['code' => 404, 'msg' => 'wallet not found']);
  84. }
  85. $balance = floatval($walletInfo['available_balance']);
  86. WalletService::updateBalance($member_id, $win_amount);
  87. BalanceLogService::addLog(
  88. $member_id,
  89. $win_amount,
  90. $balance,
  91. bcadd($balance, $win_amount, 2),
  92. '中奖',
  93. $order->id,
  94. "盈利:{$yl}"
  95. );
  96. DB::commit();
  97. return response()->json([
  98. 'code' => 200,
  99. 'issue_no' => $issue_no,
  100. 'keywords' => $keywords,
  101. 'awards' => $awards,
  102. 'amount' => $amount,
  103. 'odds' => $odds,
  104. 'win_amount' => $win_amount,
  105. 'profit' => $yl,
  106. 'balance_before' => $balance,
  107. 'balance_after' => bcadd($balance, $win_amount, 2),
  108. 'order_id' => $order->id,
  109. 'bet_time' => date('Y-m-d H:i:s', $bet_ts),
  110. ]);
  111. } catch (\Exception $e) {
  112. DB::rollBack();
  113. Log::error('settle_inject: ' . $e->getMessage());
  114. return response()->json(['code' => 500, 'msg' => $e->getMessage()]);
  115. }
  116. }
  117. }