lip 2 هفته پیش
والد
کامیت
e19d7a3281

+ 72 - 0
app/Console/Commands/OperationData.php

@@ -0,0 +1,72 @@
+<?php
+
+namespace App\Console\Commands;
+
+use Illuminate\Console\Command;
+use App\Models\Operation;
+use App\Models\FundsRecord;
+use App\Models\Order;
+use App\Models\Wallet;
+use Carbon\Carbon;
+
+class OperationData extends Command
+{
+    /**
+     * 命令名称和签名
+     *
+     * @var string
+     */
+    protected $signature = 'operation:data';
+
+    /**
+     * 命令描述
+     *
+     * @var string
+     */
+    protected $description = '统计昨日的充值提现订单等数据(每天00:00 之后执行)';
+    /**
+     * 执行命令
+     *
+     * @return int
+     */
+    public function handle()
+    {
+        $this->info('开始执行统计充值提现订单等数据任务...');
+
+        $this->addYesterdayOperationData();
+        $this->info('结束执行统计充值提现订单等数据任务');
+    }
+
+    public function addYesterdayOperationData()
+    {
+        $yesterday = Carbon::yesterday()->format('Y-m-d');
+        $data = [
+            'date' => $yesterday,
+            'recharge' => 0,
+            'user_total_money' => 0,
+        ];
+        $data['recharge'] = FundsRecord::whereIn('change_type', ['充值','人工充值','三方充值'])
+            ->where('created_at', '>=', "{$yesterday} 00:00:00")
+            ->where('created_at', '<=', "{$yesterday} 23:59:59")
+            ->sum('amount');
+
+        $data['withdraw'] = FundsRecord::whereIn('change_type', ['提现','三方提现'])
+            ->where('created_at', '>=', "{$yesterday} 00:00:00")
+            ->where('created_at', '<=', "{$yesterday} 23:59:59")
+            ->sum('amount');
+
+        $data['balance_difference'] = $data['recharge'] - $data['withdraw'];
+        $data['total_price'] = Order::where('create_time', '>=', strtotime($yesterday.' 00:00:00'))
+            ->where('create_time', '<=',  strtotime($yesterday.' 23:59:59'))
+            ->where('status', 1)
+            ->where('pay_status', 1)
+            ->where('return_status', 0)
+            ->sum('amount');
+
+        $data['user_total_money'] = Wallet::query()->sum('available_balance');
+
+        Operation::updateOrCreate(['date' => $data['date']], $data);
+        return true;
+    }
+
+}

+ 9 - 0
app/Helpers/helpers.php

@@ -2,6 +2,15 @@
 
 use Illuminate\Support\Facades\Lang;
 
+
+if (!function_exists('env')) {
+    function env($key, $default = null)
+    {
+        return env($key, $default); // 直接使用 Laravel 全局 env() 函数
+    }
+}
+
+
 if (!function_exists('list_to_tree')) {
     function list_to_tree($elements, $parentKey = "parent_id", $parentId = 0): array
     {

+ 154 - 0
app/Http/Controllers/admin/Operation.php

@@ -0,0 +1,154 @@
+<?php
+
+namespace App\Http\Controllers\admin;
+
+use App\Http\Controllers\Controller;
+use Exception;
+use App\Models\User;
+use App\Models\FundsRecord;
+use App\Models\Order;
+use App\Models\Operation as OperationModel;
+use Carbon\Carbon;
+
+class Operation extends Controller
+{
+    /**
+     * 用户报表
+     */
+    function exchangeList()
+    {
+        try {
+            $params = request()->validate([
+                'page' => ['nullable', 'integer', 'min:1'],
+                'limit' => ['nullable', 'integer', 'min:1', 'max:200'],
+                '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'],
+                'user_id' => ['nullable', 'string'],
+            ]);
+            $page = request()->input('page', 1);
+            $limit = request()->input('limit', 15);
+            $query = User::query();
+            if (isset($params['user_id'])) {
+                $user_id = $params['user_id'];
+                $query->where(function ($query1) use ($user_id) {
+                    $query1->where('user_id', $user_id)
+                        ->orWhere('first_name', 'like', "%{$user_id}%");
+                });
+            }
+
+            $count = $query->count();
+            $list = $query->join('wallets', 'users.member_id', '=', 'wallets.member_id')->orderByDesc("last_login_time")
+                ->select(['users.id', 'users.user_id', 'users.first_name', 'users.money','users.remark','wallets.available_balance as money'])
+                ->paginate($limit)
+                ->toArray();
+            
+            $start = !empty($params['start_time']) ? "{$params['start_time']} 00:00:00" : null;
+            $end = !empty($params['end_time']) ? "{$params['end_time']} 23:59:59" : null;
+
+            foreach ($list as &$item) {
+                $item['recharge'] = number_format(FundsRecord::where('member_id', $item['member_id'])
+                    ->whereIn('change_type', ['充值','人工充值','三方充值'])
+                    ->where(function ($query1) use ($start, $end) {
+                        if ($start && $end) {
+                            $query1->where('created_at', '>=', $start)
+                                ->where('created_at', '<=', $end);
+                        }
+                    })
+                    ->sum('amount'), 2);
+
+                $item['withdraw'] = number_format(FundsRecord::where('member_id', $item['member_id'])
+                    ->whereIn('change_type', ['提现','三方提现'])
+                    ->where(function ($query1) use ($start, $end) {
+                        if ($start && $end) {
+                            $query1->where('created_at', '>=', $start)
+                                ->where('created_at', '<=', $end);
+                        }
+                    })
+                    ->sum('amount'), 2);
+                //订单总额
+                $item['order_amount'] = number_format(Order::where('user_id', $item['user_id'])
+                    ->where('status', 1)
+                    ->where('pay_status', 1)
+                    ->where('return_status', 0)
+                    ->where(function ($query1) use ($start, $end) {
+                        if ($start && $end) {
+                            $start = strtotime($start.' 00:00:00');
+                            $end = strtotime($end.' 23:59:59');
+                            $query1->where('create_time', '>=', $start)
+                                ->where('create_time', '<=', $end);
+                        }
+                    })
+                    ->sum('amount'), 2);
+            }
+        } catch (Exception $e) {
+            return $this->error($e->getMessage());
+        }
+        return $this->success(['count' => $count, 'list' => $list]);
+
+    }
+
+    /**
+     * 运营数据
+     * @apiParam {String{'day','week','month','all'}} type 类型
+     * - day 今日
+     * - week 本周
+     * - month 本月
+     * - all 全部
+     */
+    function index()
+    {
+        try {
+            $params = request()->validate([
+                'page' => ['nullable', 'integer', 'min:1'],
+                'limit' => ['nullable', 'integer', 'min:1', 'max:200'],
+                'type' => ['required', 'string', 'in:day,week,month,all'],
+                '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'],
+            ]);
+            $data = [
+                'recharge' => 0,
+                'withdraw' => 0,
+                'total_price' => 0,
+                'profit_price' => 0
+            ];
+            $page = request()->input('page', 1);
+            $limit = request()->input('limit', 15);
+            $query = OperationModel::query();
+            $query1 = OperationModel::query();
+            if (!empty($params['start_time'])) {
+                $query->where('date', '>=', $params['start_time'])
+                    ->where('date', '<=', $params['end_time']);
+                $query1->where('date', '>=', $params['start_time'])
+                    ->where('date', '<=', $params['end_time']);
+            } else if ($params['type'] != 'all') {
+                switch ($params['type']) {
+                    case 'day':
+                        $date = date('Y-m-d');
+                        break;
+                    case "week":
+                        $date = Carbon::now()->startOfWeek()->format('Y-m-d');
+                        break;
+                    case "month":
+                        $date = Carbon::now()->firstOfMonth()->format('Y-m-d');
+                        break;
+                }
+                $query->where('date', '>=', $date);
+                $query1->where('date', '>=', $date);
+            }
+            $data['recharge'] = $query1->sum('recharge');
+            $data['withdraw'] = $query1->sum('withdraw');
+            $data['total_price'] = $query1->sum('total_price');
+            $data['profit_price'] = $query1->sum('profit_price');
+            $count = $query->count();
+            $list = $query
+                ->forPage($page, $limit)
+                ->orderByDesc('date')
+                ->get()->toArray();
+
+
+        } catch (Exception $e) {
+            return $this->error($e->getMessage());
+        }
+        return $this->success(['count' => $count, 'list' => $list, 'data' => $data]);
+    }
+}

+ 241 - 0
app/Http/Controllers/admin/Order.php

@@ -0,0 +1,241 @@
+<?php
+
+namespace App\Http\Controllers\admin;
+
+use App\Http\Controllers\Controller;
+use App\Models\FundsRecord;
+use App\Models\User;
+use App\Models\Admin;
+use App\Models\Order as OrderModel;
+use Exception;
+use Illuminate\Support\Facades\DB;
+use App\Constants\HttpStatus;
+
+class Order extends Controller
+{
+    /**
+     * 订单手动退款
+     */
+    public function adminRefund()
+    {
+        DB::beginTransaction();
+        try {
+            $params = request()->validate([
+                'order_id' => ['required', 'array', 'min:1'],
+                'safe_word' => ['required', 'string'],
+            ]);
+            $id = request()->user->id;
+            $admin = Admin::where('id', $id)->first();
+            if (!password_verify($params['safe_word'], $admin->payment_password)) throw new Exception('资金密码错误');
+
+            $orderList = OrderModel::whereIn('id', $params['order_id'])->get();
+            foreach ($orderList as $order) {
+                if ($order->return_status != 0 || $order->pay_status != 1) {
+                    continue;
+                }
+                
+                $order->status = 3;
+                $order->return_status = 2;
+                $order->return_operation_time = time();
+                $order->save();
+
+                $user = User::where('user_id', $order->user_id)->first();
+                if (!$user) continue;
+                if ($user->type == 1) {
+                    FundsRecord::addData([
+                        'transaction_type' => '退款',
+                        'amount' => $order->amount,
+                        'before_balance' => $user->money,
+                        'after_balance' => bcsub($user->money, $order->amount, 2),
+                        'member_id' => $user->user_id,
+                    ]);
+                    $user->money = bcsub($user->money, $order->amount, 2);
+                    $user->save();
+                }
+            }
+
+            DB::commit();
+        } catch (Exception $e) {
+            DB::rollBack();
+            return $this->error(HttpStatus::CUSTOM_ERROR, $e->getMessage());
+        }
+        return $this->success();
+    }
+
+    /**
+     * @api {post} /order/refund 同意退款
+     * @apiGroup 订单管理
+     */
+    public function refund()
+    {
+        $errors = [];
+        try {
+            DB::beginTransaction();
+            $params = request()->validate([
+                'order_id' => ['required', 'array', 'min:1'],
+                'safe_word' => ['required', 'string'],
+            ]);
+            $order_id = $params['order_id'];
+            $safeWord = $params['safe_word'];
+            $id = request()->user()->id;
+            $admin = Admin::where('id', $id)->first();
+            if (!password_verify($safeWord, $admin->payment_password)) throw new Exception('资金密码错误');
+            $order = OrderModel::where('id', $order_id)->first();
+            if (!$order) throw new Exception('订单不存在');
+            if ($order->return_status != 1 || $order->pay_status != 1) {
+                $errors = ['id' => $order_id];
+                throw new Exception("该订单状态无法操作");
+            }
+            
+            $order->status = 3;
+            $order->return_status = 2;
+            $order->return_operation_time = time();
+            $order->save();
+
+            $user = User::where('user_id', $order->user_id)->first();
+            $balanceAfter = bcadd($user->money, $order->amount, 2);
+            FundsRecord::addData([
+                'transaction_type' => '退款',
+                'amount' => $order->amount,
+                'before_balance' => $user->money,
+                'after_balance' => bcsub($user->money, $order->amount, 2),
+                'member_id' => $user->user_id,
+            ]);
+            $user->money = $balanceAfter;
+            $user->save();
+
+            DB::commit();
+        } catch (Exception $e) {
+            DB::rollBack();
+            return $this->error(HttpStatus::CUSTOM_ERROR,$e->getMessage(), $errors);
+        }
+        return $this->success();
+
+    }
+
+    /**
+     * 驳回退款申请
+     * @apiGroup 订单管理
+     */
+    public function rejection()
+    {
+        $errors = [];
+        DB::beginTransaction();
+        try {
+            $params = request()->validate([
+                'order_id' => ['required', 'array', 'min:1'],
+                'failure_msg' => ['nullable', 'string', 'max:200'],
+            ]);
+            if (empty($params['failure_msg'])) $params['failure_msg'] = '';
+
+            $order = OrderModel::where('id', $params['order_id'])->first();
+            if (!$order) throw new Exception('订单不存在');
+            if ($order->status != 1 || $order->return_status != 1) {
+                $errors = ['id' => $params['order_id']];
+                throw new Exception("该订单状态无法操作");
+            }
+            $order->return_operation_time = time();
+            $order->failure_msg = $params['failure_msg'];
+            $order->save();
+            DB::commit();
+        } catch (Exception $e) {
+            DB::rollBack();
+            return $this->error(HttpStatus::CUSTOM_ERROR,$e->getMessage(), $errors);
+        }
+        return $this->success();
+    }
+
+    /**
+     * 订单列表
+     */
+    public function list()
+    {
+        try {
+            $params = request()->validate([
+                'page' => ['nullable', 'integer', 'min:1'],
+                'limit' => ['nullable', 'integer', 'min:1'],
+                'id' => ['nullable', 'string'],
+                'user_id' => ['nullable', 'string'],
+                'order_id' => ['nullable', 'string'],
+                'pay_status' => ['nullable', 'integer', 'in:0,1'],
+                'is_win' => ['nullable', 'integer', 'in:0,1'],
+                'is_roll' => ['nullable', 'integer', 'in:0,1'],
+                'settlement_status' => ['nullable', 'integer', 'in:0,1,2,3'],
+                'return_status' => ['nullable', 'integer', 'in:0,1,2,3'],
+                'status' => ['nullable', 'integer', 'in:0,1,2,-1'],
+                '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 OrderModel();
+            if (!empty($params['start_time'])) {
+                $startTime = strtotime($params['start_time'] . " 00:00:00");
+                $query = $query->where('create_time', '>=', $startTime);
+            }
+            if (!empty($params['end_time'])) {
+                $endTime = strtotime($params['end_time'] . " 23:59:59");
+                $query = $query->where('create_time', '<=', $endTime);
+            }
+            if (!empty($params['id'])) {
+                $query = $query->where('id', $params['id']);
+            }
+            if (!empty($params['order_id'])) {
+                $query = $query->where('order_id', $params['order_id']);
+            }
+            if (!empty($params['user_id'])) {
+                $query = $query->where('user_id', $params['user_id']);
+            }
+            if (isset($params['status'])) {
+                $query = $query->where('status', $params['status']);
+            }
+            if (isset($params['return_status'])) {
+                $query = $query->where('return_status', $params['return_status']);
+            }
+            if (isset($params['pay_status'])) {
+                $query = $query->where('pay_status', $params['pay_status']);
+            }
+            if (isset($params['is_win'])) {
+                $query = $query->where('is_win', $params['is_win']);
+            }
+            if (isset($params['settlement_status'])) {
+                $query = $query->where('settlement_status', $params['settlement_status']);
+            }
+            if (isset($params['is_roll'])) {
+                $query = $query->where('is_roll', $params['is_roll']);
+            }
+
+            $count = $query->count();
+            $list = $query
+                ->forPage($page, $limit)
+                ->orderByDesc('create_time')
+                ->get();
+        } catch (Exception $e) {
+            return $this->error(HttpStatus::CUSTOM_ERROR,$e->getMessage());
+        }
+        return $this->success(['count' => $count, 'list' => $list]);
+
+    }
+
+    //订单详情
+    function info()
+    {
+        try {
+            request()->validate([
+                'order_id' => ['required', 'string'],
+            ]);
+            $order_id = request()->input('order_id');
+            $order = OrderModel::where('order_id', $order_id)->first();
+            if (!$order) throw new Exception('订单不存在');
+            $order = $order->toArray();
+            $order['detail'] = json_decode($order['detail'],true);
+            $order['game_result']  = $order['game_result'] ? json_decode($order['game_result'],true) : null;
+            ksort($order);
+        } catch (Exception $e) {
+            return $this->error(HttpStatus::CUSTOM_ERROR,$e->getMessage());
+        }
+        return $this->success($order);
+    }
+
+}

+ 8 - 0
app/Models/FundsRecord.php

@@ -0,0 +1,8 @@
+<?php
+namespace App\Models;
+
+class FundsRecord extends BaseModel
+{
+    protected $table = 'balance_logs';
+    protected $fillable = ['id', 'room_id', 'member_id' ,'amount' ,'before_balance' ,'after_balance' ,'change_type','created_at','remark'];
+}

+ 12 - 0
app/Models/Operation.php

@@ -0,0 +1,12 @@
+<?php
+
+
+namespace App\Models;
+
+
+class Operation extends BaseModel
+{
+    protected $table = 'la_operation';
+    protected $fillable = ['date', 'recharge', 'withdraw', 'balance_difference', 'total_price', 'user_total_money'];
+
+}

+ 9 - 0
app/Models/Order.php

@@ -0,0 +1,9 @@
+<?php
+namespace App\Models;
+
+class Order extends BaseModel
+{
+    protected $table = 'la_sport_order';
+    protected $fillable = ['user_id', 'order_id', 'issue' ,'is_roll' ,'amount' ,'cny_rate' ,'win_amount','profit_and_loss','is_faker','is_win', 'stattus','settlement_status',
+            'pay_status','pay_time','pay_type','return_status','return_apply_time','return_operation_time','failure_msg', 'create_time' ];
+}

+ 4 - 4
config/database.php

@@ -48,13 +48,13 @@ return [
             'url' => env('DATABASE_URL'),
             'host' => env('DB_HOST', '127.0.0.1'),
             'port' => env('DB_PORT', '3306'),
-            'database' => env('DB_DATABASE', 'forge'),
-            'username' => env('DB_USERNAME', 'forge'),
-            'password' => env('DB_PASSWORD', ''),
+            'database' => env('DB_DATABASE', 'bot-28'),
+            'username' => env('DB_USERNAME', 'root'),
+            'password' => env('DB_PASSWORD', '123456'),
             'unix_socket' => env('DB_SOCKET', ''),
             'charset' => 'utf8mb4',
             'collation' => 'utf8mb4_general_ci',
-            'prefix' => env('DB_PREFIX','forge_'),
+            'prefix' => env('DB_PREFIX','bot_'),
             'prefix_indexes' => true,
             'strict' => true,
             'engine' => "InnoDB",