Przeglądaj źródła

Merge branch 'dev'

lip 1 tydzień temu
rodzic
commit
03da525316

+ 28 - 1
app/Http/Controllers/admin/Config.php

@@ -18,7 +18,7 @@ use App\Services\ConfigService;
 class Config extends Controller
 {
 
-    /**
+    /** 设置配置
      */
     public function setField()
     {
@@ -98,6 +98,33 @@ class Config extends Controller
         return $this->success($result);
     }
 
+    /**
+     * @api {get} /admin/config/gameList 彩票配置
+     */
+    public function gameList(): JsonResponse
+    {
+        try {
+            $search['group_id'] = 5;
+            $list = ConfigModel::where('group_id', $search['group_id'])->where('field', 'game_list')->value('val');
+            $list = $list ? json_decode($list, true) : [];
+            $data = [];
+            $i = count($list);
+            foreach($list as $v) {
+                $i--;
+                $temp_key = $v['sort']*10+$i;
+                $data[$temp_key] = $v;
+            }
+            krsort($data);
+            $data = array_values($data);
+        } catch (ValidationException $e) {
+            return $this->error(HttpStatus::VALIDATION_FAILED, $e->validator->errors()->first());
+        } catch
+        (Exception $e) {
+            return $this->error(intval($e->getCode()));
+        }
+        return $this->success($data);
+    }
+
     /**
      *  分页数据
      *

+ 64 - 0
app/Http/Controllers/admin/JisuGame.php

@@ -0,0 +1,64 @@
+<?php
+
+namespace App\Http\Controllers\admin;
+
+use App\Http\Controllers\Controller;
+use App\Models\JisuGameplay;
+use Exception;
+use App\Constants\HttpStatus;
+
+class JisuGame extends Controller
+{
+    /**
+     * 足球游戏列表,树形结构
+     */
+    public function list()
+    {
+        try {
+            $params = request()->validate([
+                'type' => ['required','integer'],
+            ]);
+            $list = JisuGameplay::getGame($params['type']);
+        } catch (Exception $e) {
+            return $this->error(HttpStatus::CUSTOM_ERROR,$e->getMessage());
+        }
+        return $this->success([ 'data' => $list]);
+
+    }
+
+    //设置赔率
+    public function setOdds()
+    {
+        try {
+            $params = request()->validate([
+                'id' => ['nullable','integer'],
+                'gameplay' => ['nullable','string'],
+                'type' => ['nullable','integer'],
+                'odds' => ['required','numeric'],
+                'maxinum' => ['required','numeric'],
+                'mininum' => ['required','numeric'],
+            ]);
+            if (!empty($params['id'])) {
+                $info = JisuGameplay::where('id', $params['id'])->first();
+                if (!$info) throw new Exception('数据不存在');
+                $info->odds = $params['odds'];
+                $info->maxinum = $params['maxinum'];
+                $info->mininum = $params['mininum'];
+                $info->save();
+            } elseif (!empty($params['gameplay']) && !empty($params['type'])) {
+                JisuGameplay::where('gameplay', $params['gameplay'])->where('type', $params['type'])->update([
+                    'odds' => $params['odds'],
+                    'maxinum' => $params['maxinum'],
+                    'mininum' => $params['mininum'],
+                ]);
+            } else {
+                throw new Exception('参数错误');
+            }
+            return $this->success();
+        } catch (Exception $e) {
+            return $this->error(HttpStatus::CUSTOM_ERROR,$e->getMessage());
+        }
+    }
+
+
+}

+ 163 - 0
app/Http/Controllers/admin/JisuGameOrder.php

@@ -0,0 +1,163 @@
+<?php
+
+namespace App\Http\Controllers\admin;
+
+use App\Http\Controllers\Controller;
+use App\Models\JisuGameOrder as JisuGameOrderModel;
+use App\Models\FundsRecord;
+use App\Models\JisuGameplay;
+use App\Models\Wallet;
+use Exception;
+use App\Constants\HttpStatus;
+use Illuminate\Support\Facades\DB;
+
+class JisuGameOrder extends Controller
+{
+
+    /**
+     * 订单列表
+     */
+    public function list()
+    {
+        try {
+            $params = request()->validate([
+                'page' => ['nullable', 'integer', 'min:1'],
+                'limit' => ['nullable', 'integer', 'min:1'],
+                'ordernum' => ['nullable', 'string'],
+                'member_id' => ['nullable', 'integer'],
+                'first_name' => ['nullable'],
+                'gameplay' => ['nullable', 'string'],
+                'status' => ['nullable', 'integer'],
+                'id' => ['nullable', 'integer'],
+                'type' => ['nullable', 'integer'],
+                'start_time' => ['nullable', 'date', 'date_format:Y-m-d', 'required_with:end_time'],
+                'end_time' => ['nullable', 'date', 'date_format:Y-m-d', 'required_with:start_time'],
+            ]);
+            $page = request()->input('page', 1);
+            $limit = request()->input('limit', 15);
+
+            $query = new JisuGameOrderModel();
+            
+            $query = JisuGameOrderModel::join('users', 'users.member_id', '=', 'jisu_game_order.member_id')
+                        ->join('jisu_gameplay', 'jisu_gameplay.id', '=', 'jisu_game_order.gameplay_id')
+                        ->leftJoin('jisu_lottery', function($join) {
+                            $join->on('jisu_game_order.type', '=', 'jisu_lottery.type')
+                                 ->on('jisu_game_order.issue', '=', 'jisu_lottery.issue');
+                        });
+            if (!empty($params['id'])) {
+                $query = $query->where('jisu_game_order.id', $params['id']);
+            }
+            if (!empty($params['type'])) {
+                $query = $query->where('jisu_game_order.type', $params['type']);
+            }
+            if (!empty($params['ordernum'])) {
+                $query = $query->where('jisu_game_order.ordernum', $params['ordernum']);
+            }
+            if (!empty($params['member_id'])) {
+                $query = $query->where('jisu_game_order.member_id', $params['member_id']);
+            }
+            if (isset($params['status']) && $params['status'] !== null) {
+                $query = $query->where('jisu_game_order.status', $params['status']);
+            }
+            if (!empty($params['gameplay'])) {
+                $query = $query->where('jisu_gameplay.gameplay', 'like', '%'.$params['gameplay'].'%');
+            }
+            if (!empty($params['first_name'])) {
+                $query = $query->where('users.first_name', 'like', "%{$params['first_name']}%");
+            }
+            if (!empty($params['start_time'])) {
+                $startTime = $params['start_time'] . " 00:00:00";
+                $query = $query->where('jisu_game_order.created_at', '>=', $startTime);
+            }
+            if (!empty($params['end_time'])) {
+                $endTime = $params['end_time'] . " 23:59:59";
+                $query = $query->where('jisu_game_order.created_at', '<=', $endTime);
+            }
+            $count = $query->count();
+            $list = $query->select('jisu_game_order.*','users.first_name','users.member_id', 'jisu_gameplay.gameplay','jisu_gameplay.number','jisu_lottery.open_code','jisu_lottery.open_code_other')
+                ->forPage($page, $limit)
+                ->orderByDesc('jisu_game_order.created_at')
+                ->get();
+        } catch (Exception $e) {
+            return $this->error(HttpStatus::CUSTOM_ERROR,$e->getMessage());
+        }
+        return $this->success(['total' => $count, 'data' => $list]);
+
+    }
+
+    //订单详情
+    function info()
+    {
+        try {
+            request()->validate([
+                'id' => ['required', 'integer'],
+            ]);
+            $id = request()->input('id');
+            $order = JisuGameOrderModel::join('users', 'users.member_id', '=', 'jisu_game_order.member_id')
+                        ->join('jisu_gameplay', 'jisu_gameplay.id', '=', 'jisu_game_order.gameplay_id')
+                        ->leftJoin('jisu_lottery', function($join) {
+                            $join->on('jisu_game_order.type', '=', 'jisu_lottery.type')
+                                 ->on('jisu_game_order.issue', '=', 'jisu_lottery.issue');
+                        })
+                        ->where('jisu_game_order.id', $id)
+                        ->select('jisu_game_order.*','users.first_name','users.member_id', 'jisu_gameplay.gameplay','jisu_lottery.open_code','jisu_lottery.open_code_other')
+                        ->first();
+            if (!$order) throw new Exception('订单不存在');
+            $order = $order->toArray();
+        } catch (Exception $e) {
+            return $this->error(HttpStatus::CUSTOM_ERROR,$e->getMessage());
+        }
+        return $this->success($order);
+    }
+
+    /**
+     * 同意退款
+     */
+    public function refund()
+    {
+        $errors = [];
+        try {
+            DB::beginTransaction();
+            $params = request()->validate([
+                'id' => ['required', 'array', 'min:1'],
+                'remark' => ['nullable', 'string'],
+            ]);
+            $orderList = JisuGameOrderModel::whereIn('id', $params['id'])->get();
+            foreach ($orderList as $order) {
+                if ($order->status != 0) {
+                    continue;
+                }
+                
+                $order->status = 3;
+                $order->updated_at = time();
+                $order->save();
+
+                // 获取用户余额
+                $walletInfo = Wallet::where(['member_id' => $order->member_id])->first();
+
+                $before = $walletInfo->available_balance;
+                $after = bcsub($walletInfo->available_balance, $order->amount, 2);
+                $walletInfo->available_balance = $after;
+                $walletInfo->save();
+                $remark = JisuGameplay::getRemark($order->type);
+                
+                FundsRecord::addData([
+                    'change_type' => $remark.'退款',
+                    'amount' => $order->amount,
+                    'before_balance' => $before,
+                    'after_balance' => $after,
+                    'member_id' => $order->member_id,
+                    'related_id' => $order->id,
+                    'remark' => $remark.'退款',
+                ]);
+            }
+            DB::commit();
+        } catch (Exception $e) {
+            DB::rollBack();
+            return $this->error(HttpStatus::CUSTOM_ERROR,$e->getMessage(), $errors);
+        }
+        return $this->success();
+
+    }
+
+}

+ 107 - 0
app/Http/Controllers/admin/JisuLottery.php

@@ -0,0 +1,107 @@
+<?php
+
+namespace App\Http\Controllers\admin;
+
+use App\Http\Controllers\Controller;
+use App\Models\JisuLottery as JisuLotteryModel;
+use Exception;
+use App\Constants\HttpStatus;
+
+class JisuLottery extends Controller
+{
+    /**
+     * 开奖管理列表
+     */
+    public function list()
+    {
+        try {
+            $params = request()->validate([
+                'page' => ['nullable', 'integer', 'min:1'],
+                'limit' => ['nullable', 'integer', 'min:1'],
+                'type' => ['nullable', 'integer', 'min:1'],
+                'status' => ['nullable', 'integer'],
+                'is_settlement' => ['nullable', 'integer'],
+                'issue' => ['nullable', 'string'],
+                'open_code' => ['nullable', 'string'],
+                'start_time' => ['nullable', 'string'],
+                'end_time' => ['nullable', 'string'],
+            ]);
+            $page = request()->input('page', 1);
+            $limit = request()->input('limit', 15);
+
+            $query = new JisuLotteryModel();
+            if (!empty($params['type'])) {
+                $query = $query->where('type', $params['type']);
+            }
+            if (!empty($params['status'])) {
+                $query = $query->where('status', $params['status']);
+            }
+            if (isset($params['is_settlement'])) {
+                $query = $query->where('is_settlement', $params['is_settlement']);
+            }
+            if (!empty($params['issue'])) {
+                $query = $query->where('issue', $params['issue']);
+            }
+            if (!empty($params['open_code'])) {
+                $query = $query->where('open_code', $params['open_code']);
+            }
+            if (!empty($params['start_time'])) {
+                $query = $query->where('open_time', '>=', strtotime($params['start_time'].' 00:00:00'));
+            }
+            if (!empty($params['end_time'])) {
+                $query = $query->where('open_time', '<', strtotime($params['end_time'].' 23:59:59'));
+            }
+            $count = $query->count();
+            $list = $query
+                ->forPage($page, $limit)
+                ->orderByDesc('open_time')
+                ->get();
+        } catch (Exception $e) {
+            return $this->error(HttpStatus::CUSTOM_ERROR,$e->getMessage());
+        }
+        return $this->success(['total' => $count, 'data' => $list]);
+
+    }
+    
+    //设置预开奖号码
+    public function setAdvanceCode()
+    {
+        try {
+            $params = request()->validate([
+                'id' => ['required','integer'],
+                'advance_code' => ['required','array'],
+            ]);
+            $id = $params['id'];
+            // if (count($params['advance_code']) != 7) {
+            //     throw new Exception('开奖号码必须是7个数');
+            // }
+            $info = JisuLotteryModel::where('id', $id)->first();
+            if (!$info) throw new Exception('数据不存在');
+            if (!empty($info->open_code)) {
+                throw new Exception('已开奖');
+            }
+            if (!empty($info->advance_code)) {
+                throw new Exception('已设置');
+            }
+            if ($info->type == 2) {
+                if (count($params['advance_code']) != 5) {
+                    throw new Exception('开奖号码必须是5个数');
+                }
+            } elseif ($info->type == 6) {
+                if (count($params['advance_code']) != 3) {
+                    throw new Exception('开奖号码必须是3个数');
+                }
+            } else {
+                if (count($params['advance_code']) != 10) {
+                    throw new Exception('开奖号码必须是10个数');
+                }
+            }
+            $info->advance_code = implode(",",$params['advance_code']);
+            $info->save();
+            return $this->success();
+        } catch (Exception $e) {
+            return $this->error(HttpStatus::CUSTOM_ERROR,$e->getMessage());
+        }
+    }
+
+}

+ 84 - 7
app/Http/Controllers/admin/LhcOrder.php

@@ -6,6 +6,10 @@ use App\Http\Controllers\Controller;
 use App\Models\LhcOrder as LhcOrderModel;
 use App\Models\FundsRecord;
 use App\Models\Wallet;
+use App\Models\LhcLottery;
+use App\Models\PcIssue;
+use App\Models\Issue;
+use App\Models\JisuLottery;
 use Exception;
 use App\Constants\HttpStatus;
 use Illuminate\Support\Facades\DB;
@@ -74,11 +78,47 @@ class LhcOrder extends Controller
                 $query = $query->where('users.first_name', 'like', "%{$params['first_name']}%");
             }
             $count = $query->count();
-            $list = $query->with(['lottery'])
-                ->select('lhc_order.*','users.first_name','users.member_id')
+            $list = $query->select('lhc_order.*','users.first_name','users.member_id')
                 ->forPage($page, $limit)
                 ->orderByDesc('lhc_order.created_at')
                 ->get();
+            foreach($list as &$info) {
+                //六合彩彩票
+                if ($info['type'] >= 1 and $info['type'] <= 4) {
+                    $lottery = LhcLottery::where('type', $info['type'])->where('issue', $info['issue'])->first();
+                    if ($lottery) {
+                        $info['lottery'] = [
+                            'open_code' => $lottery->open_code,
+                            'open_code_other' => ''
+                        ];
+                    }
+                }
+
+                //28
+                if ($info['type'] == 5 || $info['type'] == 6) {
+                    if ($info['type'] == 6) {
+                        $issue = PcIssue::where('issue_no', $info['issue'])->first();
+                    } elseif ($info['type'] == 5)  {
+                        $issue = Issue::where('issue_no', $info['issue'])->first();
+                    }
+
+                    $info['lottery'] = [
+                        'open_code' => $issue->winning_numbers,
+                        'open_code_other' => $issue->combo
+                    ];
+                }
+
+                //极速彩票
+                if ($info['type'] >= 7 and $info['type'] <= 13) {
+                    $lottery = JisuLottery::where('type', $info['type'] - 6)->where('issue', $info['issue'])->first();
+                    if ($lottery) {
+                        $info['lottery'] = [
+                            'open_code' => $lottery->open_code,
+                            'open_code_other' => $lottery->open_code_other
+                        ];
+                    }
+                }
+            }
         } catch (Exception $e) {
             return $this->error(HttpStatus::CUSTOM_ERROR,$e->getMessage());
         }
@@ -94,13 +134,50 @@ class LhcOrder extends Controller
                 'id' => ['required', 'integer'],
             ]);
             $id = request()->input('id');
-            $order = LhcOrderModel::where('id', $id)->first();
-            if (!$order) throw new Exception('订单不存在');
-            $order = $order->toArray();
+            $info = LhcOrderModel::where('id', $id)->first();
+            if (!$info) throw new Exception('订单不存在');
+            $info = $info->toArray();
+
+            //六合彩彩票
+            if ($info['type'] >= 1 and $info['type'] <= 4) {
+                $lottery = LhcLottery::where('type', $info['type'])->where('issue', $info['issue'])->first();
+                if ($lottery) {
+                    $info['lottery'] = [
+                        'open_code' => $lottery->open_code,
+                        'open_code_other' => ''
+                    ];
+                }
+            }
+
+            //28
+            if ($info['type'] == 5 || $info['type'] == 6) {
+                if ($info['type'] == 6) {
+                    $issue = PcIssue::where('issue_no', $info['issue'])->first();
+                } elseif ($info['type'] == 5)  {
+                    $issue = Issue::where('issue_no', $info['issue'])->first();
+                }
+
+                $info['lottery'] = [
+                    'open_code' => $issue->winning_numbers,
+                    'open_code_other' => $issue->combo
+                ];
+            }
+
+            //极速彩票
+            if ($info['type'] >= 7 and $info['type'] <= 13) {
+                $lottery = JisuLottery::where('type', $info['type'] - 6)->where('issue', $info['issue'])->first();
+                if ($lottery) {
+                    $info['lottery'] = [
+                        'open_code' => $lottery->open_code,
+                        'open_code_other' => $lottery->open_code_other
+                    ];
+                }
+            }
+
         } catch (Exception $e) {
             return $this->error(HttpStatus::CUSTOM_ERROR,$e->getMessage());
         }
-        return $this->success($order);
+        return $this->success($info);
     }
 
     /**
@@ -141,7 +218,7 @@ class LhcOrder extends Controller
                     'amount' => $order->amount,
                     'before_balance' => $before,
                     'after_balance' => $after,
-                    'member_id' => $order->user_id,
+                    'member_id' => $order->member_id,
                     'related_id' => $order->id,
                     'remark' => $remark.'订单退款',
                 ]);

+ 1 - 1
app/Http/Controllers/admin/SportGameOrder.php

@@ -140,7 +140,7 @@ class SportGameOrder extends Controller
                     'amount' => $order->amount,
                     'before_balance' => $before,
                     'after_balance' => $after,
-                    'member_id' => $order->user_id,
+                    'member_id' => $order->member_id,
                     'related_id' => $order->id,
                     'remark' => '足球游戏订单退款',
                 ]);

+ 10 - 0
app/Models/JisuGameOrder.php

@@ -0,0 +1,10 @@
+<?php
+
+namespace App\Models;
+
+class JisuGameOrder extends BaseModel
+{
+    protected $table = 'jisu_game_order';
+    protected $fillable = ['ordernum', 'gameplay_id', 'member_id','odds','amount','status','win_amount','profit_and_loss','remark'];
+    protected $hidden = [];
+}

+ 51 - 0
app/Models/JisuGameplay.php

@@ -0,0 +1,51 @@
+<?php
+
+namespace App\Models;
+
+class JisuGameplay extends BaseModel
+{
+    protected $table = 'jisu_gameplay';
+    protected $fillable = [ 'game', 'game_en', 'gameplay', 'gameplay_en', 'number', 'number_en', 'odds','type','maxinum','mininum'];
+    
+    public static function getGame($type) {
+        $list = JisuGameplay::where('type',$type)->get()->toArray();
+        $tree = [];
+        foreach($list as $item) {
+            if (!isset($tree[$item['gameplay']])) {
+                $tree[$item['gameplay']] = [
+                    'gameplay' => $item['gameplay'],
+                    'gameplay_en' => $item['gameplay_en'],
+                ];
+            }
+            $tree[$item['gameplay']]['children'][] = [
+                'id' => $item['id'],
+                'type' => $item['type'],
+                'name' => $item['number'],
+                'name_en' => $item['number_en'],
+                'odds' => $item['odds'],
+                'maxinum' => $item['maxinum'],
+                'mininum' => $item['mininum'],
+            ];
+        }
+        return array_values($tree);
+    }
+
+    public static function getRemark($type) {
+        if ($type == 1) {
+            return '极速赛车';
+        } elseif ($type == 2) {
+            return '极速时时彩';
+        } elseif ($type == 3) {
+            return '极速飞艇';
+        } elseif ($type == 4) {
+            return 'SG时时彩';
+        } elseif ($type == 5) {
+            return 'SG飞艇';
+        } elseif ($type == 6) {
+            return '极速快3';
+        } elseif ($type == 7) {
+            return 'SG快3';
+        }
+        return $type;
+    }
+}

+ 18 - 0
app/Models/JisuLottery.php

@@ -0,0 +1,18 @@
+<?php
+namespace App\Models;
+
+class JisuLottery extends BaseModel
+{
+    protected $table = 'jisu_lottery';
+    protected $fillable = ['issue', 'open_code','open_time','is_settlement','next_open_time','type','advance_code'];
+
+    protected function getOpenTimeAttribute($value): string
+    {
+        return $value ? date('Y-m-d H:i:s', $value) : '';
+    }
+
+    protected function getNextOpenTimeAttribute($value): string
+    {
+        return $value ? date('Y-m-d H:i:s', $value) : '';
+    }
+}

+ 24 - 1
app/Models/LhcOrder.php

@@ -10,6 +10,11 @@ class LhcOrder extends BaseModel
     public $timestamps = true;
     protected $dateFormat = 'U'; // U 代表 UNIX 时间戳(int)
 
+    const STATUS_STAY = 0;  // 待开奖
+    const STATUS_LOSS = 1; // 未中奖
+    const STATUS_WIN = 2; // 已中奖
+    const STATUS_REFUND = 3; // 已退款
+
     public function lottery()
     {
         return $this->belongsTo(LhcLottery::class, 'issue', 'issue')
@@ -26,7 +31,25 @@ class LhcOrder extends BaseModel
             return '澳门六合彩';
         } elseif ($type == 4) {
             return '极速六合彩';
-        } 
+        } elseif ($type == 5) {
+            return '加拿大28';
+        } elseif ($type == 6) {
+            return '极速28';
+        } elseif ($type == 7) {
+            return '极速赛车';
+        } elseif ($type == 8) {
+            return '极速时时彩';
+        } elseif ($type == 9) {
+            return '极速飞艇';
+        } elseif ($type == 10) {
+            return 'SG时时彩';
+        } elseif ($type == 11) {
+            return 'SG飞艇';
+        } elseif ($type == 12) {
+            return '极速快3';
+        } elseif ($type == 13) {
+            return 'SG快3';
+        }
         return '';
     }
  

+ 9 - 1
app/Services/BalanceLogService.php

@@ -28,7 +28,15 @@ class BalanceLogService extends BaseService
         '新澳门六合彩投注','新澳门六合彩退款','新澳门六合彩和局退款','新澳门六合彩中奖',
         '香港六合彩投注','香港六合彩退款','香港六合彩和局退款','香港六合彩中奖','加拿大28投注','极速28投注',
         '澳门六合彩投注','澳门六合彩退款','澳门六合彩和局退款','澳门六合彩中奖',
-        '急速六合彩投注','急速六合彩退款','急速六合彩和局退款','急速六合彩中奖',
+        '极速六合彩投注','极速六合彩退款','极速六合彩和局退款','极速六合彩中奖',
+        '极速赛车投注','极速赛车退款','极速赛车和局退款','极速赛车中奖',
+        '极速时时彩投注','极速时时彩退款','极速时时彩中奖',
+        '极速飞艇投注','极速飞艇退款','极速飞艇中奖',
+        '极速快3投注','极速快3退款','极速快3和局退款','极速快3中奖',
+        'SG时时彩投注','SG时时彩退款','SG时时彩中奖',
+        'SG飞艇投注','SG飞艇退款','SG飞艇中奖',
+        'SG快3投注','SG快3退款','SG快3中奖',
+        '足球游戏投注','足球游戏退款','足球游戏中奖',
         '投注','中奖', '资产转移', '比比返', '返水', '回水', '笔笔返', '投注退分','充值返现','即充即送','老用户回归','余额宝转入','转出至余额宝','余额宝利息','流水解冻'
     ];
 

+ 68 - 69
app/Services/BetService.php

@@ -9,7 +9,7 @@ use App\Models\Message;
 use App\Models\PcIssue;
 use App\Models\Rebate;
 use App\Models\User;
-use App\Models\Bet;
+use App\Models\LhcOrder;
 use App\Models\Config;
 use Illuminate\Support\Facades\App;
 use Illuminate\Support\Facades\DB;
@@ -115,7 +115,7 @@ class BetService extends BaseService
      */
     public static function model(): string
     {
-        return Bet::class;
+        return LhcOrder::class;
     }
 
     /**
@@ -132,16 +132,22 @@ class BetService extends BaseService
     {
         $where = [];
         if (isset($search['issue_no']) && !empty($search['issue_no'])) {
-            $where[] = ['issue_no', '=', $search['issue_no']];
+            $where[] = ['issue', '=', $search['issue_no']];
+        }
+        if (isset($search['issue']) && !empty($search['issue'])) {
+            $where[] = ['issue', '=', $search['issue']];
         }
         if (isset($search['member_id']) && !empty($search['member_id'])) {
             $where[] = ['member_id', '=', $search['member_id']];
         }
         if (isset($search['keywords']) && !empty($search['keywords'])) {
-            $where[] = ['keywords', '=', $search['keywords']];
+            $where[] = ['number', '=', $search['keywords']];
+        }
+        if (isset($search['number']) && !empty($search['number'])) {
+            $where[] = ['number', '=', $search['number']];
         }
         if (isset($search['issue_id']) && !empty($search['issue_id'])) {
-            $where[] = ['issue_id', '=', $search['issue_id']];
+            $where[] = ['lhc_number_id', '=', $search['issue_id']];
         }
         if (isset($search['id']) && !empty($search['id'])) {
             $where[] = ['id', '=', $search['id']];
@@ -157,19 +163,22 @@ class BetService extends BaseService
         }
 
         if (isset($search['is_winner']) && $search['is_winner'] != '') {
-            $where[] = ['status', '=', 2];
+            $where[] = ['lottery_status', '=', 2];
             if ($search['is_winner'] == 1) {
-                $where[] = ['profit', '>', 0];
+                $where[] = ['profit_and_loss', '>', 0];
             } else {
-                $where[] = ['profit', '<=', 0];
+                $where[] = ['profit_and_loss', '<=', 0];
             }
         } else {
             if (isset($search['status']) && $search['status'] != '') {
-                $where[] = ['status', '=', $search['status']];
+                $where[] = ['lottery_status', '=', $search['status']];
             }
         }
-
-
+        if (isset($search['lottery_status']) && !empty($search['lottery_status'])) {
+            $where[] = ['lottery_status', '=', $search['lottery_status']];
+        }
+        $where[] = ['type', '>=', 5];
+        $where[] = ['type', '<=', 6];
         return $where;
     }
 
@@ -178,7 +187,7 @@ class BetService extends BaseService
      * @param array $search
      * @return \App\Models\Coin|null
      */
-    public static function findOne(array $search): ?Bet
+    public static function findOne(array $search): ?LhcOrder
     {
         return self::model()::where(self::getWhere($search))->first();
     }
@@ -407,7 +416,8 @@ class BetService extends BaseService
 
         $userInfo = UserService::findOne(['member_id' => $memberId]);
 
-        $betInfo = self::findOne(['member_id' => $memberId, 'issue_no' => $issueInfo->issue_no, 'keywords' => $keywords]); // 相同下注
+        $type = $pc28Switch == 1 ? 6 : 5;
+        $betInfo = LhcOrder::where(['type' => $type, 'member_id' => $memberId, 'issue' => $issueInfo->issue_no, 'number' => $keywords])->first(); // 相同下注
 
         if ($betInfo) {
             $betInfo->amount = $betInfo->amount + $amount;
@@ -416,13 +426,15 @@ class BetService extends BaseService
         } else {
             $data = [];
             $data['amount'] = $amount; // 分数
-            $data['keywords'] = $keywords;  // 玩法
+            $data['number'] = $keywords;  // 玩法
             $data['member_id'] = $memberId;
             $data['user_id'] = $userInfo->id;
-            $data['issue_no'] = $issueInfo->issue_no;
-            $data['issue_id'] = $issueInfo->id;
+            $data['issue'] = $issueInfo->issue_no;
+            $data['lhc_number_id'] = $issueInfo->id;
             $data['odds'] = $gameplayRuleInfo['odds'];
-            $newBet = self::model()::create($data);
+            $data['type'] = $type;
+            $newBet = LhcOrder::create($data);
+
             $bet_id = $newBet->id;
         }
 
@@ -622,12 +634,12 @@ class BetService extends BaseService
             $text = lang("期数") . " {$issue_no} \n";
             // $text .= "\n";
             // $text .= "----------\n";
-            $list = self::findAll(['member_id' => $memberId, 'issue_no' => $issue_no]);
+            $list = self::findAll(['member_id' => $memberId, 'issue' => $issue_no]);
             $list = $list->toArray();
             if (empty($list)) {
                 $text .= lang("本期暂未下注") . "! \n";
             } else {
-                $keywords = implode(',', array_column($list, 'keywords'));
+                $keywords = implode(',', array_column($list, 'number'));
                 $amounts = implode(',', array_column($list, 'amount'));
 
 
@@ -657,15 +669,15 @@ class BetService extends BaseService
      */
     public static function recentlyRecord($memberId, $page = 1, $limit = 5)
     {
-        $list = self::model()::where('member_id', $memberId)->whereIn('status', [self::model()::STATUS_STAY, self::model()::STATUS_SETTLED])->orderBy('id', 'desc')->forPage($page, $limit)->get();
+        $list = self::model()::where('type', 'in', [5,6])->where('member_id', $memberId)->orderBy('id', 'desc')->forPage($page, $limit)->get();
 
         // $text = "```\n";
         $text = "";
         $text .= "期数--内容--盈亏 \n";
         foreach ($list->toArray() as $k => $v) {
-            $profit = $v['profit'] - $v['amount'];
+            $profit = $v['win_amount'] - $v['amount'];
             // $text .= $v['issue_no']." ".$v['keywords']." ".$v['amount']." ".$v['profit']."\n";
-            $item = $v['issue_no'] . "==" . $v['keywords'] . rtrim(rtrim(number_format($v['amount'], 2, '.', ''), '0'), '.') . "==" . rtrim(rtrim(number_format($profit, 2, '.', ''), '0'), '.') . "\n";
+            $item = $v['issue'] . "==" . $v['number'] . rtrim(rtrim(number_format($v['amount'], 2, '.', ''), '0'), '.') . "==" . rtrim(rtrim(number_format($profit, 2, '.', ''), '0'), '.') . "\n";
             $text .= $item;
         }
         // $text .= "```\n";
@@ -689,8 +701,8 @@ class BetService extends BaseService
         }
 
         $msg['chat_id'] = $memberId;
-        $list = self::model()::where('member_id', $memberId)->whereIn('status', [self::model()::STATUS_STAY, self::model()::STATUS_SETTLED])->where(self::getWhere(['is_winner' => $type]))->orderBy('id', 'desc')->forPage($page, $limit)->get();
-        $count = self::model()::where('member_id', $memberId)->whereIn('status', [self::model()::STATUS_STAY, self::model()::STATUS_SETTLED])->where(self::getWhere(['is_winner' => $type]))->count();
+        $list = self::model()::where('type', 'in', [5,6])->where('member_id', $memberId)->orderBy('id', 'desc')->forPage($page, $limit)->get();
+        $count = self::model()::where('type', 'in', [5,6])->where('member_id', $memberId)->count();
 
         $keyboard = [];
 
@@ -700,16 +712,15 @@ class BetService extends BaseService
         $text = lang("历史注单") . " \n";
         $text .= lang("中奖总派彩") . ":{$total_amount} \n";
         foreach ($list as $k => $v) {
-            if ($v->status == self::model()::STATUS_SETTLED) {
-                $phase = $v->profit - $v->amount;
-
+            if ($v->lottery_status == self::model()::STATUS_WIN || $v->lottery_status == self::model()::STATUS_LOSS) {
+                $phase = $v->win_amount - $v->amount;
             } else {
                 $phase = lang('待开奖');
             }
 
             $text .= "-------------------------------------\n";
-            $text .= lang("期数") . ":{$v->issue_no} \n";
-            $text .= lang("内容") . ":{$v->keywords} \n";
+            $text .= lang("期数") . ":{$v->issue} \n";
+            $text .= lang("内容") . ":{$v->number} \n";
             $text .= lang("金额") . ":{$v->amount} \n";
             $text .= lang("盈亏") . ":{$phase} \n";
         }
@@ -754,7 +765,7 @@ class BetService extends BaseService
      */
     public static function betFail($issue_no)
     {
-        $list = self::findAll(['issue_no' => $issue_no, 'status' => self::model()::STATUS_STAY]);
+        $list = self::findAll(['issue' => $issue_no, 'lottery_status' => self::model()::STATUS_STAY]);
         foreach ($list->toArray() as $k => $v) {
             $profit = $v['amount'];
             WalletService::updateBalance($v['member_id'], $profit);
@@ -765,13 +776,13 @@ class BetService extends BaseService
             BalanceLogService::addLog($v['member_id'], $profit, ($balance - $profit), $balance, '投注退分', $v['id'], '');
 
             $text = $issue_no . "期开奖失败 \n";
-            $text .= "投注类型:{$v['keywords']} \n";
+            $text .= "投注类型:{$v['number']} \n";
             $text .= "投注金额:{$v['amount']} \n";
             $text .= "投注的资金已退回您的钱包 \n";
 
             self::asyncSendMessage($v['member_id'], $text);
             $item = [];
-            $iem['status'] = self::model()::STATUS_SETTLED;
+            $item['lottery_status'] = self::model()::STATUS_LOSS;
             self::model()::where('id', $v['id'])->update($item);
         }
 
@@ -785,9 +796,9 @@ class BetService extends BaseService
      */
     public static function betSettled($issue_no, $awards)
     {
-        $list = self::findAll(['issue_no' => $issue_no, 'status' => self::model()::STATUS_STAY]);
+        $list = self::findAll(['issue' => $issue_no, 'lottery_status' => self::model()::STATUS_STAY]);
         // 大小单双的
-        $otherSum = self::model()::where('issue_no', $issue_no)->where('status', self::model()::STATUS_STAY)->whereIn('keywords', ['大', '小', '单', '双'])->sum('amount');
+        $otherSum = self::model()::where('type', 'in', [5,6])->where('issue', $issue_no)->where('lottery_status', self::model()::STATUS_STAY)->whereIn('number', ['大', '小', '单', '双'])->sum('amount');
 
         $fakeOpenData = self::fakeLotteryDraw($issue_no, $awards, 0);
         $keywordsList = $fakeOpenData['keywordsList'];
@@ -798,33 +809,29 @@ class BetService extends BaseService
         $betNoticeMini = max(1, (int)($betNoticeNum[0] ?? 26));
         $betNoticeMax = max($betNoticeMini, (int)($betNoticeNum[1] ?? 38));
         $noticeNum = rand($betNoticeMini, $betNoticeMax);
-
-        $realNoticeNum = ceil($noticeNum / 2);
         $openList = [];
         $memberList = [];
-        $bet_num = 0;
+        
         foreach ($list->toArray() as $k => $v) {
-            if (isset($keywordsList[$v['keywords']])) {
-                $keywordsList[$v['keywords']] += $v['amount'];
+            if (isset($keywordsList[$v['number']])) {
+                $keywordsList[$v['number']] += $v['amount'];
             } else {
-                $keywordsList[$v['keywords']] = $v['amount'];
+                $keywordsList[$v['number']] = $v['amount'];
             }
-            // $userInfo = UserService::findAll(['member_id' => $v['member_id']]);
-            // $lastStr = self::getLastChar($userInfo->first_name, 1);
             $lastStr = self::hideMiddleDigits($v['member_id'], 4);
             $item = [];
             $item['id'] = $v['id'];
-            $item['status'] = self::model()::STATUS_SETTLED;
+            $item['lottery_status'] = self::model()::STATUS_LOSS;//未中奖
+            $item['profit_and_loss'] = -$v['amount'];
 
-
-            if (in_array($v['keywords'], $awards)) {
+            if (in_array($v['number'], $awards)) {
                 $amount = $v['amount'];
                 $odds = $v['odds'];
 
 //                玩 大单 小单 大双 小双 :如果开出13和14 总注小于10000 1.5赔率含本,大于等于10000退本金。
                 if (in_array('13操', $awards) || in_array('14操', $awards)) {
                     // 13 14特殊处理倍率
-                    if (in_array($v['keywords'], self::$OTHER_BET_2)) {
+                    if (in_array($v['number'], self::$OTHER_BET_2)) {
                         if ($sum < 10000) {
                             $odds = 1.5;
                         } else {
@@ -839,12 +846,10 @@ class BetService extends BaseService
                     $profit = 1000000; // 单注最高奖金1000000
                 }
 
-                $item['profit'] = $profit;
-
-                // $yl = $profit - $amount;
+                $item['lottery_status'] = self::model()::STATUS_WIN;//中奖
+                $item['win_amount'] = $profit;
                 $yl = bcsub($profit, $amount, 2); // 盈利
-
-
+                $item['profit_and_loss'] = $yl;
                 $rebate = Rebate::updateProfit([
                     'member_id' => $v['member_id'],
                     'profit' => $yl,
@@ -855,10 +860,9 @@ class BetService extends BaseService
                     ActivityUserService::updateBettingAmount($v['member_id'],$v['amount']);
                 }
 
-
                 $memberList[$v['member_id']][] = [
                     'member_id' => $v['member_id'],
-                    'keywords' => $v['keywords'],
+                    'keywords' => $v['number'],
                     'amount' => $v['amount'],
                     'profit' => $profit,
                     'yl' => $yl,
@@ -874,8 +878,8 @@ class BetService extends BaseService
                     $openList[$v['member_id']]['amount'] += $v['amount'];
                     $openList[$v['member_id']]['profit'] += $profit;
                     $openList[$v['member_id']]['lastStr'] = $lastStr;
-                    $openList[$v['member_id']]['openKeywords'][] = $v['keywords'] . "({$odds}" . lang("倍率") . ")";
-                    $openList[$v['member_id']]['keywords'][] = $v['keywords'];
+                    $openList[$v['member_id']]['openKeywords'][] = $v['number'] . "({$odds}" . lang("倍率") . ")";
+                    $openList[$v['member_id']]['keywords'][] = $v['number'];
                     $openList[$v['member_id']]['win_amount'] += $v['amount'];
 
                 } else {
@@ -885,8 +889,8 @@ class BetService extends BaseService
                     $openList[$v['member_id']]['lastStr'] = $lastStr;
                     $openList[$v['member_id']]['openKeywords'] = [];
                     $openList[$v['member_id']]['keywords'] = [];
-                    $openList[$v['member_id']]['openKeywords'][] = $v['keywords'] . "({$odds}" . lang("倍率") . ")";
-                    $openList[$v['member_id']]['keywords'][] = $v['keywords'];
+                    $openList[$v['member_id']]['openKeywords'][] = $v['number'] . "({$odds}" . lang("倍率") . ")";
+                    $openList[$v['member_id']]['keywords'][] = $v['number'];
                     $openList[$v['member_id']]['win_amount'] = $v['amount'];
                     $openList[$v['member_id']]['is_send'] = true;
 
@@ -898,19 +902,17 @@ class BetService extends BaseService
                     'profit' => ($v['amount'] * -1),
                 ]);
 
-
                 if (!in_array('13操', $awards) && !in_array('14操', $awards)) {
                     RebateService::updateEffectiveBettingAmount($rebate, $v['amount']);
                     ActivityUserService::updateBettingAmount($v['member_id'],$v['amount']);
                 }
-
                 $profit = 0;
 //                玩 大单 小单 大双 小双 :如果开出13和14 总注小于10000 1.5赔率含本,大于等于10000退本金。
                 if (in_array('13操', $awards) || in_array('14操', $awards)) {
                     $amount = $v['amount'];
                     $odds = 0;
                     // 13 14特殊处理倍率
-                    if (in_array($v['keywords'], self::$OTHER_BET_2)) {
+                    if (in_array($v['number'], self::$OTHER_BET_2)) {
                         if ($sum < 10000) {
                             $odds = 1.5;
                         } else {
@@ -918,32 +920,29 @@ class BetService extends BaseService
                         }
                     }
 
-
-//                    if (in_array($v['keywords'], self::$OTHER_BET_2)) {
-//                        $odds = 1;
-//                    }
                     $profit = bcmul($amount, $odds, 2); // 保留两位小数
 
                     if ($profit > 1000000) {
                         $profit = 1000000; // 单注最高奖金1000000
                     }
 
-                    $item['profit'] = $profit;
+                    $item['lottery_status'] = self::model()::STATUS_WIN;//中奖
+                    $item['win_amount'] = $profit;
 
                     $yl = bcsub($profit, $amount, 2); // 盈利
+                    $item['profit_and_loss'] = $yl;
                     $walletInfo = WalletService::findOne(['member_id' => $v['member_id']]);
                     $balance = $walletInfo['available_balance'];
                     WalletService::updateBalance($v['member_id'], $profit);
                     BalanceLogService::addLog($v['member_id'], $profit, $balance, ($balance + $profit), '中奖', $v['id'], "盈利:{$yl}");
                 }
 
-
                 if (isset($openList[$v['member_id']])) {
                     $openList[$v['member_id']]['member_id'] = $v['member_id'];
                     $openList[$v['member_id']]['amount'] += $v['amount'];
                     $openList[$v['member_id']]['profit'] += $profit;
                     $openList[$v['member_id']]['lastStr'] = $lastStr;
-                    $openList[$v['member_id']]['keywords'][] = $v['keywords'];
+                    $openList[$v['member_id']]['keywords'][] = $v['number'];
                 } else {
                     $openList[$v['member_id']]['member_id'] = $v['member_id'];
                     $openList[$v['member_id']]['amount'] = $v['amount'];
@@ -951,7 +950,7 @@ class BetService extends BaseService
                     $openList[$v['member_id']]['lastStr'] = $lastStr;
                     $openList[$v['member_id']]['openKeywords'] = [];
                     $openList[$v['member_id']]['keywords'] = [];
-                    $openList[$v['member_id']]['keywords'][] = $v['keywords'];
+                    $openList[$v['member_id']]['keywords'][] = $v['number'];
                     $openList[$v['member_id']]['win_amount'] = 0;
                     $openList[$v['member_id']]['is_send'] = true;
                 }
@@ -1182,7 +1181,7 @@ class BetService extends BaseService
         }
 
         // 真实投注
-        $list = self::findAll(['issue_no' => $issue_no, 'status' => self::model()::STATUS_STAY]);
+        $list = self::findAll(['issue_no' => $issue_no]);
         foreach ($list->toArray() as $k => $v) {
             if (isset($keywordsList[$v['keywords']])) {
                 $keywordsList[$v['keywords']] += $v['amount'];

+ 18 - 0
routes/admin.php

@@ -40,6 +40,9 @@ use App\Http\Controllers\admin\RechargeChannel;
 use App\Http\Controllers\admin\UserFeedback;
 use App\Http\Controllers\admin\SportGame;
 use App\Http\Controllers\admin\SportGameOrder;
+use App\Http\Controllers\admin\JisuGame;
+use App\Http\Controllers\admin\JisuGameOrder;
+use App\Http\Controllers\admin\JisuLottery;
 
 Route::post('/login', [Admin::class, 'login']);
 Route::get('/test', [Wallet::class, 'test']);
@@ -176,6 +179,7 @@ Route::middleware(['admin.jwt'])->group(function () {
         Route::prefix('/config')->group(function () {
             Route::get('/pcConfig', [Config::class, 'pcConfig']);
             Route::post('/pc28Switch', [Config::class, 'pc28Switch']);
+            Route::get('/gameList', [Config::class, 'gameList']);
 
 
             Route::get('/getAll', [Config::class, 'getAll']);
@@ -315,6 +319,20 @@ Route::middleware(['admin.jwt'])->group(function () {
             Route::get('/info', [SportGameOrder::class, 'info']);
             Route::post('/refund', [SportGameOrder::class, 'refund']);
         });
+        
+        Route::prefix('/jisuGame')->group(function () {
+            Route::get('/list', [JisuGame::class, 'list']);
+            Route::post('/setOdds', [JisuGame::class, 'setOdds']);
+        });
+        Route::prefix('/jisuGameOrder')->group(function () {
+            Route::get('/list', [JisuGameOrder::class, 'list']);
+            Route::get('/info', [JisuGameOrder::class, 'info']);
+            Route::post('/refund', [JisuGameOrder::class, 'refund']);
+        });
+        Route::prefix('/jisuLottery')->group(function () {
+            Route::get('/list', [JisuLottery::class, 'list']);
+            Route::post('/setAdvanceCode', [JisuLottery::class, 'setAdvanceCode']);
+        });
     });