lip 13 tuntia sitten
vanhempi
sitoutus
5c84593152

+ 18 - 0
app/Helpers/helpers.php

@@ -10,6 +10,24 @@ if (!function_exists('env')) {
     }
     }
 }
 }
 
 
+/**
+ * 格式化小数:去掉末尾无用的0,但至少保留1位小数
+ * @param float|string $number 要格式化的数字
+ */
+function formatDecimal($number, $len = 1)
+{
+    // 先转成浮点数,去掉末尾多余的0
+    $num = (float)$number;
+
+    // 判断是否是整数(如 2.000 → 2)
+    if (floor($num) == $num) {
+        return number_format($num, $len); // 强制保留$len位小数
+    }
+
+    // 非整数,返回去掉末尾0的结果
+    return rtrim(rtrim((string)$num, '0'), '.');
+}
+
 /**
 /**
  * @notes 随机生成token值
  * @notes 随机生成token值
  * @param string $extra
  * @param string $extra

+ 21 - 0
app/Http/Controllers/admin/LhcNumber.php

@@ -46,4 +46,25 @@ class LhcNumber extends Controller
 
 
     }
     }
 
 
+    //设置赔率
+    public function setOdds()
+    {
+        try {
+            $params = request()->validate([
+                'id' => ['required','integer'],
+                'odds' => ['required','float']
+            ]);
+            $id = $params['id'];
+            $info = LhcNumberModel::where('id', $id)->first();
+            if (!$info) throw new Exception('数据不存在');
+
+            $info->odds = $params['odds'];
+            $info->updated_by = auth()->id();
+            $info->save();
+            return $this->success();
+        } catch (Exception $e) {
+            return $this->error(HttpStatus::CUSTOM_ERROR,$e->getMessage());
+        }
+    }
+
 }
 }

+ 29 - 2
app/Http/Controllers/admin/Order.php

@@ -6,6 +6,7 @@ use App\Http\Controllers\Controller;
 use App\Models\FundsRecord;
 use App\Models\FundsRecord;
 use App\Models\User;
 use App\Models\User;
 use App\Models\Order as OrderModel;
 use App\Models\Order as OrderModel;
+use App\Models\Sport;
 use Exception;
 use Exception;
 use Illuminate\Support\Facades\DB;
 use Illuminate\Support\Facades\DB;
 use App\Constants\HttpStatus;
 use App\Constants\HttpStatus;
@@ -86,11 +87,15 @@ class Order extends Controller
                 'status' => ['nullable', 'integer', 'in:0,1,2,-1'],
                 'status' => ['nullable', 'integer', 'in:0,1,2,-1'],
                 'start_time' => ['nullable', 'date', 'date_format:Y-m-d', 'required_with:end_time'],
                 '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'],
                 'end_time' => ['nullable', 'date', 'date_format:Y-m-d', 'required_with:start_time'],
+                'league' => ['nullable'],
+                'home_team' => ['nullable'],
+                'guest_team' => ['nullable'],
             ]);
             ]);
             $page = request()->input('page', 1);
             $page = request()->input('page', 1);
             $limit = request()->input('limit', 15);
             $limit = request()->input('limit', 15);
 
 
-            $query = OrderModel::join('sport_odds', 'sport_odds.odd_name_en', '=', 'sport_order.odd_name');
+            $query = OrderModel::join('sport_odds', 'sport_odds.odd_name_en', '=', 'sport_order.odd_name')
+                        ->join('sport', 'sport.data_id', '=', 'sport_order.issue');
             if (!empty($params['id'])) {
             if (!empty($params['id'])) {
                 $query = $query->where('sport_order.id', $params['id']);
                 $query = $query->where('sport_order.id', $params['id']);
             }
             }
@@ -129,13 +134,35 @@ class Order extends Controller
             if (isset($params['is_roll'])) {
             if (isset($params['is_roll'])) {
                 $query = $query->where('sport_order.is_roll', $params['is_roll']);
                 $query = $query->where('sport_order.is_roll', $params['is_roll']);
             }
             }
+            if (!empty($params['league'])) {
+                $query = $query->where('league|league_en', 'like', '%' . $params['league'] . '%');
+            }
+            if (!empty($params['home_team'])) {
+                $query = $query->where('home_team|home_team_en', 'like', '%' . $params['home_team'] . '%');
+            }
+            if (!empty($params['guest_team'])) {
+                $query = $query->where('guest_team|guest_team_en', 'like', '%' . $params['guest_team'] . '%');
+            }
 
 
             $count = $query->count();
             $count = $query->count();
             $list = $query
             $list = $query
-                ->select(['sport_order.*','sport_odds.odd_name as odd_name'])
+                ->select(['sport_order.*','sport_odds.odd_name as odd_name', 'sport.league', 'sport.league_en', 'sport.home_team', 'sport.home_team_en', 'sport.guest_team', 'sport.guest_team_en'])
                 ->forPage($page, $limit)
                 ->forPage($page, $limit)
                 ->orderByDesc('sport_order.create_time')
                 ->orderByDesc('sport_order.create_time')
                 ->get();
                 ->get();
+            foreach($list as &$item) {
+                $item['odd_name'] = Sport::doOddName($item['odd_name']);
+                $item['odd_value'] = Sport::doOddValue($item['odd_value']);
+                $item['odd'] = formatDecimal($item['odd'], 2);
+                if (!empty($item['detail']['game_time'])) {
+                    $item['game_time'] = date('Y-m-d H:i:s', $item['detail']['game_time']);
+                } else {
+                    $item['game_time'] = '';
+                } 
+                if (!empty($item['detail']['fixture_status'])) {
+                    $item['fixture_status'] = Sport::doOddValue($item['odd_value']);
+                } 
+            }
         } catch (Exception $e) {
         } catch (Exception $e) {
             return $this->error(HttpStatus::CUSTOM_ERROR,$e->getMessage());
             return $this->error(HttpStatus::CUSTOM_ERROR,$e->getMessage());
         }
         }

+ 5 - 0
app/Models/Order.php

@@ -15,6 +15,11 @@ class Order extends BaseModel
     const CREATED_AT = 'create_time';
     const CREATED_AT = 'create_time';
     const UPDATED_AT = 'update_time';
     const UPDATED_AT = 'update_time';
 
 
+    protected function getDetailAttribute($value): string
+    {
+        return $value ? json_decode($value, true) : null;
+    }
+
     protected function getPayTimeAttribute($value): string
     protected function getPayTimeAttribute($value): string
     {
     {
         return $value ? date('Y-m-d H:i:s', $value) : '';
         return $value ? date('Y-m-d H:i:s', $value) : '';

+ 52 - 1
app/Models/Sport.php

@@ -134,8 +134,40 @@ class Sport extends BaseModel
         return $new_odds;
         return $new_odds;
     }
     }
 
 
+    //翻译赔率名称
+    public static function doOddName($odd_name) {
+        // 1. 获取赔率,缓存数据
+        $sport_odds = cache('sport_odds');
+        if (!$sport_odds) {
+            $sport_odds = SportOdds::where('function_name', '<>', null)->select()->toArray();
+            Cache::set('sport_odds', $sport_odds, 300); //有效期5分钟
+        }
+
+        $sport_odds = array_column($sport_odds, null,'odd_name_en');
+
+        if (isset($sport_odds[$odd_name])) {
+            return $sport_odds[$odd_name]['odd_name'];
+        }
+        return $odd_name;
+    }
+
+    //翻译下注项
+    public static function doOddValue($odd_value) {
+        if (empty($odd_value)) {
+            return $odd_value;
+        }
+        $special_str = self::isSpecialStr($odd_value);
+        if ($special_str) {
+            $odd_value = lang($special_str, [str_replace($special_str,'', $odd_value)]);
+        } else {
+            $odd_value = lang($odd_value);
+        }
+        return $odd_value;
+    }
+    
     public static function isSpecialStr($value) {
     public static function isSpecialStr($value) {
-        
+        if ($value === null)
+            return '';
         if (stripos($value, 'u/yes ') !== false) {
         if (stripos($value, 'u/yes ') !== false) {
             return 'u/yes ';
             return 'u/yes ';
         } elseif (stripos($value, 'u/no ') !== false) {
         } elseif (stripos($value, 'u/no ') !== false) {
@@ -164,10 +196,29 @@ class Sport extends BaseModel
             return 'Over ';
             return 'Over ';
         } elseif (stripos($value, 'Under ') !== false) {
         } elseif (stripos($value, 'Under ') !== false) {
             return 'Under ';
             return 'Under ';
+        } elseif (stripos($value, 'Home +') !== false) {
+            return 'Home +';
+        } elseif (stripos($value, 'Away +') !== false) {
+            return 'Away +';
+        } elseif (stripos($value, 'Draw +') !== false) {
+            return 'Draw +';
+        } elseif (stripos($value, 'Home -') !== false) {
+            return 'Home -';
+        } elseif (stripos($value, 'Away -') !== false) {
+            return 'Away -';
+        } elseif (stripos($value, 'Draw -') !== false) {
+            return 'Draw -';
+        } elseif (stripos($value, 'Exactly ') !== false) {
+            return 'Exactly ';
         }
         }
         return '';
         return '';
     }
     }
 
 
+    public static function getFixtureStatus($fixture_status) {
+        $fixture_status['long'] = $fixture_status['long'] ? lang($fixture_status['long']) : $fixture_status['long'];
+        return $fixture_status;
+    }
+
     protected function getOddValuesLockedAttribute($value)
     protected function getOddValuesLockedAttribute($value)
     {
     {
         return $value ? json_decode($value, true) : [];
         return $value ? json_decode($value, true) : [];

+ 11 - 1
lang/en/messages.php

@@ -341,7 +341,7 @@ return [
     'u/yes ' => 'Under %s Goals/Yes',
     'u/yes ' => 'Under %s Goals/Yes',
     'u/no ' => 'Over %s Goals/No',
     'u/no ' => 'Over %s Goals/No',
     'No goal' => 'No Goal',
     'No goal' => 'No Goal',
-    ' or more' => '%s Goals or More',
+    ' or more' => 'Over %s Goals',
     'more ' => 'Over %s Goals',
     'more ' => 'Over %s Goals',
     'Over' => 'Over',
     'Over' => 'Over',
     'Under' => 'Under',
     'Under' => 'Under',
@@ -362,6 +362,16 @@ return [
     'Draw/Home' => 'Draw/Home Win',
     'Draw/Home' => 'Draw/Home Win',
     'Draw/Draw' => 'Draw/Draw',
     'Draw/Draw' => 'Draw/Draw',
     'Draw/Away' => 'Draw/Away Win',
     'Draw/Away' => 'Draw/Away Win',
+    'Home +' => 'Home +%s',
+    'Away +' => 'Away +%s',
+    'Draw +' => 'Draw +%s',
+    'Home -' => 'Home -%s',
+    'Away -' => 'Away -%s',
+    'Draw -' => 'Draw -%s',
+    'Odd' => 'Odd',
+    'Even' => 'Even',
+    'Exactly ' => 'Exactly',
+    'Exactly' => 'Exactly',
     "操" => " Operation ",
     "操" => " Operation ",
     "尾" => " Tail ",
     "尾" => " Tail ",
     "头" => " First Digit ",
     "头" => " First Digit ",

+ 26 - 16
lang/vi/messages.php

@@ -328,23 +328,23 @@ return [
     'Home or Draw' => 'Thắng nhà hoặc hòa',
     'Home or Draw' => 'Thắng nhà hoặc hòa',
     'Away or Draw' => 'Thắng khách hoặc hòa',
     'Away or Draw' => 'Thắng khách hoặc hòa',
     'Home or Away' => 'Thắng nhà hoặc thắng khách',
     'Home or Away' => 'Thắng nhà hoặc thắng khách',
-    'Draw/Over ' => 'Hòa/n %s bàn',
-    'Away/Over ' => 'Thắng khách/n %s bàn',
-    'Home/Over ' => 'Thắng nhà/n %s bàn',
-    'Draw/Under ' => 'Hòa/Không quá %s bàn',
-    'Away/Under ' => 'Thắng khách/Không quá %s bàn',
-    'Home/Under ' => 'Thắng nhà/Không quá %s bàn',
-    'Over ' => 'n %s bàn',
-    'Under ' => 'Không quá %s bàn',
-    'o/yes ' => 'n %s bàn/Có',
-    'o/no ' => 'Không quá %s bàn/Không',
-    'u/yes ' => 'Không quá %s bàn/Có',
-    'u/no ' => 'n %s bàn/Không',
+    'Draw/Over ' => 'Hòa/lớn %s bàn',
+    'Away/Over ' => 'Thắng khách/lớn %s bàn',
+    'Home/Over ' => 'Thắng nhà/lớn %s bàn',
+    'Draw/Under ' => 'Hòa/nhỏ %s bàn',
+    'Away/Under ' => 'Thắng khách/nhỏ %s bàn',
+    'Home/Under ' => 'Thắng nhà/nhỏ %s bàn',
+    'Over ' => 'lớn %s bàn',
+    'Under ' => 'nhỏ %s bàn',
+    'o/yes ' => 'lớn %s bàn/Có',
+    'o/no ' => 'nhỏ %s bàn/Không',
+    'u/yes ' => 'nhỏ %s bàn/Có',
+    'u/no ' => 'lớn %s bàn/Không',
     'No goal' => 'Không có bàn thắng',
     'No goal' => 'Không có bàn thắng',
-    ' or more' => '%s bàn trở lên',
-    'more ' => 'n %s bàn',
-    'Over' => 'n',
-    'Under' => 'Không quá',
+    ' or more' => 'lớn %s bàn',
+    'more ' => 'lớn %s bàn',
+    'Over' => 'lớn',
+    'Under' => 'nhỏ',
     'Home/Yes' => 'Thắng nhà/Có',
     'Home/Yes' => 'Thắng nhà/Có',
     'Home/No' => 'Thắng nhà/Không',
     'Home/No' => 'Thắng nhà/Không',
     'Away/Yes' => 'Thắng khách/Có',
     'Away/Yes' => 'Thắng khách/Có',
@@ -362,6 +362,16 @@ return [
     'Draw/Home' => 'Hòa/Thắng nhà',
     'Draw/Home' => 'Hòa/Thắng nhà',
     'Draw/Draw' => 'Hòa/Hòa',
     'Draw/Draw' => 'Hòa/Hòa',
     'Draw/Away' => 'Hòa/Thắng khách',
     'Draw/Away' => 'Hòa/Thắng khách',
+    'Home +' => 'Thắng nhà +%s',
+    'Away +' => 'Thắng khách +%s',
+    'Draw +' => 'Hòa +%s',
+    'Home -' => 'Thắng nhà -%s',
+    'Away -' => 'Thắng khách -%s',
+    'Draw -' => 'Hòa -%s',
+    'Odd' => 'Lẻ',
+    'Even' => 'Chẵn',
+    'Exactly ' => 'Tất cả',
+    'Exactly' => 'Tất cả',
     "操" => " Thao tác ",
     "操" => " Thao tác ",
     "尾" => " Đuôi ",
     "尾" => " Đuôi ",
     "头" => " Đầu số ",
     "头" => " Đầu số ",

+ 28 - 18
lang/zh/messages.php

@@ -320,31 +320,31 @@ return [
     "提现不能少于20 USDT,请重试" => "⚠️提现不能少于20 USDT,请重试",
     "提现不能少于20 USDT,请重试" => "⚠️提现不能少于20 USDT,请重试",
     "您有未完成的活动" => "您有未完成的活动",
     "您有未完成的活动" => "您有未完成的活动",
     //赔率玩法
     //赔率玩法
-    'Home' => '主',
+    'Home' => '主',
     'Draw' => '平局',
     'Draw' => '平局',
-    'Away' => '客',
+    'Away' => '客',
     'Yes' => '是',
     'Yes' => '是',
     'No' => '否',
     'No' => '否',
     'Home or Draw' => '主胜或平局',
     'Home or Draw' => '主胜或平局',
     'Away or Draw' => '客胜或平局',
     'Away or Draw' => '客胜或平局',
     'Home or Away' => '主胜或客胜',
     'Home or Away' => '主胜或客胜',
-    'Draw/Over ' => '平局/大%s球',
-    'Away/Over ' => '客胜/大%s球',
-    'Home/Over ' => '主胜/大%s球',
-    'Draw/Under ' => '平局/小%s球',
-    'Away/Under ' => '客胜/小%s球',
-    'Home/Under ' => '主胜/小%s球',
-    'Over ' => '大%s球',
-    'Under ' => '小%s球',
-    'o/yes ' => '大%s球/是',
-    'o/no ' => '小%s球/否',
-    'u/yes ' => '小%s球/是',
-    'u/no ' => '大%s球/否',
+    'Draw/Over ' => '平局/大%s球',
+    'Away/Over ' => '客胜/大%s球',
+    'Home/Over ' => '主胜/大%s球',
+    'Draw/Under ' => '平局/小%s球',
+    'Away/Under ' => '客胜/小%s球',
+    'Home/Under ' => '主胜/小%s球',
+    'Over ' => '大%s球',
+    'Under ' => '小%s球',
+    'o/yes ' => '大%s球/是',
+    'o/no ' => '小%s球/否',
+    'u/yes ' => '小%s球/是',
+    'u/no ' => '大%s球/否',
     'No goal' => '无进球',
     'No goal' => '无进球',
-    ' or more' => '%s球以上',
-    'more ' => '大%s球',
-    'Over' => '大',
-    'Under' => '小',
+    ' or more' => '%s球',
+    'more ' => '大%s球',
+    'Over' => '大',
+    'Under' => '小',
     'Home/Yes' => '主胜/是',
     'Home/Yes' => '主胜/是',
     'Home/No' => '主胜/否',
     'Home/No' => '主胜/否',
     'Away/Yes' => '客胜/是',
     'Away/Yes' => '客胜/是',
@@ -362,6 +362,16 @@ return [
     'Draw/Home' => '平局/主胜',
     'Draw/Home' => '平局/主胜',
     'Draw/Draw' => '平局/平局',
     'Draw/Draw' => '平局/平局',
     'Draw/Away' => '平局/客胜',
     'Draw/Away' => '平局/客胜',
+    'Home +' => '主队 +%s',
+    'Away +' => '客队 +%s',
+    'Draw +' => '平局 +%s',
+    'Home -' => '主队 -%s',
+    'Away -' => '客队 -%s',
+    'Draw -' => '平局 -%s',
+    'Odd' => '单',
+    'Even' => '双',
+    'Exactly ' => '精确',
+    'Exactly' => '精确',
     "操" => "操",
     "操" => "操",
     "尾" => "尾",
     "尾" => "尾",
     "头" => "头",
     "头" => "头",

+ 1 - 0
routes/admin.php

@@ -249,6 +249,7 @@ Route::middleware(['admin.jwt'])->group(function () {
         });
         });
         Route::prefix('/lhcNumber')->group(function () {
         Route::prefix('/lhcNumber')->group(function () {
             Route::get('/list', [LhcNumber::class, 'list']);
             Route::get('/list', [LhcNumber::class, 'list']);
+            Route::post('/setOdds', [LhcNumber::class, 'setOdds']);
         });
         });
         Route::prefix('/lhcLottery')->group(function () {
         Route::prefix('/lhcLottery')->group(function () {
             Route::get('/list', [LhcLottery::class, 'list']);
             Route::get('/list', [LhcLottery::class, 'list']);