all(); } $page = $params['page'] ?? 1; $limit = $params['limit'] ?? 20; $keyword = $params['keyword'] ?? ''; $user_id = $params['user_id'] ?? ''; $status = $params['status'] ?? ''; $type = $params['type'] ?? ''; // 1-充值,2-提现 $accountType = $params['account_type'] ?? ''; // 1-会员,2-代理,3-商户 $startTime = $params['start_time'] ?? ''; $endTime = $params['end_time'] ?? ''; $query = BalanceLogModel::where('mark', 1); // 数据隔离:只查询当前用户的记录(基于 member 表的 user_id) if ($currentUserId) { $query->where('user_id', $currentUserId); } // 类型筛选 if ($type !== '') { $query->where('type', $type); } // 账户类型筛选 if ($accountType !== '') { $query->where('account_type', $accountType); } // 关键词搜索(订单号、姓名、手机号) if (!empty($keyword)) { $query->where(function($q) use ($keyword) { $q->where('order_no', 'like', "%{$keyword}%") ->orWhere('realname', 'like', "%{$keyword}%") ->orWhereHas('user', function($sq) use ($keyword) { $sq->where('realname', 'like', "%{$keyword}%") ->orWhere('nickname', 'like', "%{$keyword}%") ->orWhere('mobile', 'like', "%{$keyword}%"); }); }); } if(!empty($user_id)){ $query->where("user_id", $user_id); } // 状态筛选 if ($status !== '') { $query->where('status', $status); } // 时间范围 if (!empty($startTime)) { $query->where('create_time', '>=', strtotime($startTime)); } if (!empty($endTime)) { $query->where('create_time', '<=', strtotime($endTime . ' 23:59:59')); } // 打印 SQL 语句用于调试 \Log::info('BalanceLogsService getList SQL: ' . $query->toSql()); \Log::info('BalanceLogsService getList Bindings: ' . json_encode($query->getBindings())); $total = $query->count(); $list = $query->with(['user:id,realname,nickname,mobile,user_type']) ->orderBy('create_time', 'desc') ->offset(($page - 1) * $limit) ->limit($limit) ->get() ->toArray(); // 格式化数据 foreach ($list as &$item) { $item['money'] = number_format($item['money'], 2, '.', ''); $item['actual_money'] = number_format($item['actual_money'], 2, '.', ''); $item['create_time_text'] = date('Y-m-d H:i:s', $item['create_time']); $item['update_time_text'] = date('Y-m-d H:i:s', $item['update_time']); $item['status_text'] = $this->getStatusText($item['status']); $item['pay_type_text'] = $this->getPayTypeText($item['pay_type']); $item['account_type_text'] = $this->getAccountTypeText($item['account_type']); $item['type_text'] = $item['type'] == 1 ? '充值' : '提现'; // 根据账户类型添加额外信息 if (isset($item['user'])) { $item['user_realname'] = $item['user']['realname'] ?? ''; $item['user_nickname'] = $item['user']['nickname'] ?? ''; $item['user_mobile'] = $item['user']['mobile'] ?? ''; $item['user_type'] = $item['user']['user_type'] ?? 0; } } return [ 'code' => 0, 'msg' => '获取成功', 'data' => $list, 'count' => $total ]; } /** * 获取详情 * @param int $id 记录ID * @param int $currentUserId 当前用户的 member_id(member 表的 ID),用于数据隔离 */ public function getInfo($id = null, $currentUserId = null) { // 如果没有传入ID,从请求中获取 if ($id === null) { $id = request()->input('id'); } $query = BalanceLogModel::where('id', $id) ->where('mark', 1); // 数据隔离:只能查看自己的记录(基于 member 表的 user_id) if ($currentUserId) { $query->where('user_id', $currentUserId); } $info = $query->with(['user:id,realname,nickname,mobile,user_type']) ->first(); if (!$info) { return ['code' => 1, 'msg' => '记录不存在或无权访问']; } $info = $info->toArray(); $info['money'] = number_format($info['money'], 2, '.', ''); $info['actual_money'] = number_format($info['actual_money'], 2, '.', ''); $info['create_time_text'] = date('Y-m-d H:i:s', $info['create_time']); $info['update_time_text'] = date('Y-m-d H:i:s', $info['update_time']); $info['status_text'] = $this->getStatusText($info['status']); $info['pay_type_text'] = $this->getPayTypeText($info['pay_type']); $info['account_type_text'] = $this->getAccountTypeText($info['account_type']); $info['type_text'] = $info['type'] == 1 ? '充值' : '提现'; // 根据账户类型添加额外信息 if (isset($info['user'])) { $info['user_realname'] = $info['user']['realname'] ?? ''; $info['user_nickname'] = $info['user']['nickname'] ?? ''; $info['user_mobile'] = $info['user']['mobile'] ?? ''; $info['user_type'] = $info['user']['user_type'] ?? 0; } return [ 'code' => 0, 'msg' => '获取成功', 'data' => $info ]; } /** * 提交结算申请(商家/代理/会员提交) */ public function apply($data) { try { // 生成订单号 $orderNo = 'BL' . date('YmdHis') . rand(1000, 9999); $record = new BalanceLogModel(); $record->order_no = $orderNo; $record->user_id = $data['user_id'] ?? 0; // 选择的用户ID $record->type = $data['type'] ?? 2; // 1-充值,2-提现 $record->account_type = $data['account_type'] ?? 1; $record->realname = $data['realname'] ?? ''; $record->money = $data['money'] ?? 0; $record->actual_money = $data['money'] ?? 0; // 默认实际到账等于申请金额 $record->pay_type = $data['pay_type'] ?? 10; $record->account = $data['account'] ?? ''; $record->account_remark = $data['account_remark'] ?? ''; $record->pay_status = 10; // 10-待支付 $record->status = 1; // 1-待审核 $record->date = date('Y-m-d H:i:s'); $record->create_time = time(); $record->update_time = time(); $record->mark = 1; $record->save(); return [ 'code' => 0, 'msg' => '申请提交成功', 'data' => ['order_no' => $orderNo] ]; } catch (\Exception $e) { return [ 'code' => 1, 'msg' => '提交失败:' . $e->getMessage() ]; } } /** * 审核结算申请(管理员审核) */ public function audit($id = null, $status = null, $actualMoney = null, $remark = '', $payImg = '') { // 如果没有传入参数,从请求中获取 if ($id === null) { $params = request()->all(); $id = $params['id'] ?? null; $status = $params['status'] ?? null; $actualMoney = $params['actual_money'] ?? null; $remark = $params['confirm_remark'] ?? ($params['remark'] ?? ''); $payImg = $params['pay_img'] ?? ''; } if (empty($id) || !in_array($status, [2, 3])) { return ['code' => 1, 'msg' => '参数错误']; } DB::beginTransaction(); try { $record = BalanceLogModel::where('id', $id) ->where('mark', 1) ->lockForUpdate() ->first(); if (!$record) { throw new \Exception('申请记录不存在'); } if ($record->status != 1) { throw new \Exception('该记录已处理,无法重复审核'); } // 更新状态 $record->status = $status; $record->confirm_remark = $remark; $record->update_time = time(); // 更新实际到账金额 if ($actualMoney !== null) { $record->actual_money = $actualMoney; } // 如果是通过,更新支付状态和打款凭证 if ($status == 2) { $record->pay_status = 20; // 20-已支付 $record->pay_at = date('Y-m-d H:i:s'); if (!empty($payImg)) { $record->pay_img = $payImg; } // 如果是代理提现审核通过,更新代理表的累计提现金额 if ($record->account_type == 2 && $record->type == 2) { $this->updateAgentWithdrawTotal($record); } } $record->save(); // 如果是驳回且是提现,退回金额 if ($status == 3 && $record->type == 2) { $this->refundBalance($record); } DB::commit(); return ['code' => 0, 'msg' => '审核成功']; } catch (\Exception $e) { DB::rollBack(); return ['code' => 1, 'msg' => '审核失败:' . $e->getMessage()]; } } /** * 列表 * @param $params * @param int $pageSize * @return array */ public function getDataList($params, $pageSize = 10) { $where = ['a.mark' => 1]; $list = $this->model->from('balance_logs as a') ->leftJoin('member as b','b.id','=','a.user_id') ->leftJoin('driver as c','c.id','=','a.user_id') ->where($where) ->where(function ($query) use($params){ $userType = isset($params['user_type'])? $params['user_type'] : 0; if($userType == 1){ $query->where('a.user_type', $userType); $keyword = isset($params['keyword'])? $params['keyword'] : ''; if($keyword){ $query->where(function($query) use($keyword){ $query->where('a.order_no','like',"%{$keyword}%")->orWhere('b.nickname','like',"%{$keyword}%")->orWhere('b.mobile','like',"%{$keyword}%"); }); } }else if ($userType == 2){ $query->where('a.user_type', $userType); $keyword = isset($params['keyword'])? $params['keyword'] : ''; if($keyword){ $query->where(function($query) use($keyword){ $query->where('a.order_no','like',"%{$keyword}%")->orWhere('c.realname','like',"%{$keyword}%")->orWhere('c.mobile','like',"%{$keyword}%"); }); } } }) ->where(function ($query) use($params){ $status = isset($params['status'])? $params['status'] : 0; if($status>0 && is_array($status)){ $query->whereIn('a.status', $status); }else if($status){ $query->where('a.status', $status); } $type = isset($params['type'])? $params['type'] : 0; if($type>0){ $query->where('a.type', $type); } }) ->select(['a.*','b.nickname as user_nickname','b.realname as user_realname','b.mobile as user_mobile','c.realname as driver_name','c.mobile as driver_mobile','c.realname as driver_realname']) ->orderBy('a.create_time','desc') ->orderBy('a.id','desc') ->paginate($pageSize > 0 ? $pageSize : 9999999); $list = $list? $list->toArray() :[]; if($list){ foreach($list['data'] as &$item){ $item['create_time'] = $item['create_time']? datetime($item['create_time'],'Y-m-d H.i.s') : ''; $item['qrcode'] = $item['qrcode']? get_image_url($item['qrcode']) : ''; $item['account'] = $item['account']? json_decode($item['account'], true) : []; $item['username'] = $item['user_nickname']? $item['user_nickname'].($item['user_mobile']?'-'.$item['user_mobile']:'') : ''; $item['driver'] = $item['driver_name']? $item['driver_name'].($item['driver_mobile']?'-'.$item['driver_mobile']:'') : ''; if($item['user_type'] == 2){ $item['realname'] = $item['realname']? $item['realname'] : $item['driver_realname']; }else{ $item['realname'] = $item['realname']? $item['realname'] : $item['user_realname']; } } } return [ 'pageSize'=> $pageSize, 'total'=>isset($list['total'])? $list['total'] : 0, 'list'=> isset($list['data'])? $list['data'] : [] ]; } /** * 统计 * @param $params * @return array */ public function getCount($params) { $where = ['a.mark' => 1]; $model = $this->model->from('balance_logs as a') ->leftJoin('member as b','b.id','=','a.user_id') ->where($where) ->where(function ($query) use($params){ $userType = isset($params['user_type'])? $params['user_type'] : 0; if($userType == 1){ $query->where('a.user_type', $userType); $keyword = isset($params['keyword'])? $params['keyword'] : ''; if($keyword){ $query->where(function($query) use($keyword){ $query->where('a.order_no','like',"%{$keyword}%")->orWhere('b.nickname','like',"%{$keyword}%")->orWhere('b.mobile','like',"%{$keyword}%"); }); } } }) ->where(function ($query) use($params){ $status = isset($params['status'])? $params['status'] : 0; if($status>0 && is_array($status)){ $query->whereIn('a.status', $status); }else if($status){ $query->where('a.status', $status); } $type = isset($params['type'])? $params['type'] : 0; if($type>0){ $query->where('a.type', $type); } }); $counts = [ 'count'=> $model->count('a.id'), 'total'=> $model->sum('a.money'), ]; return $counts; } /** * 更新代理表的累计提现金额 */ private function updateAgentWithdrawTotal($record) { // 查找代理记录 $agent = AgentModel::where('user_id', $record->user_id) ->where('mark', 1) ->first(); if ($agent) { // 累加提现金额到 withdraw_total $agent->withdraw_total = bcadd($agent->withdraw_total ?? 0, $record->actual_money, 2); $agent->save(); } } /** * 退回余额(根据账户类型退回到对应的表) */ private function refundBalance($record) { switch ($record->account_type) { case 1: // 会员账户 $user = MemberModel::find($record->user_id); if ($user) { $user->balance = bcadd($user->balance, $record->money, 2); $user->save(); } break; case 2: // 代理账户 $agent = AgentModel::where('user_id', $record->user_id) ->where('mark', 1) ->first(); if ($agent) { $agent->balance = bcadd($agent->balance, $record->money, 2); $agent->save(); } break; case 3: // 商户账户 $store = StoreModel::where('user_id', $record->user_id) ->where('mark', 1) ->first(); if ($store) { $store->balance = bcadd($store->balance, $record->money, 2); $store->save(); } break; } } /** * 删除记录 * @param int $id 记录ID * @param int $currentUserId 当前用户的 member_id(member 表的 ID),用于数据隔离 */ public function delete($id = null, $currentUserId = null) { // 获取参数 if ($id === null) { $id = request()->input('id'); } $query = BalanceLogModel::where('id', $id) ->where('mark', 1); // 数据隔离:只能删除自己的记录(基于 member 表的 user_id) if ($currentUserId) { $query->where('user_id', $currentUserId); } $record = $query->first(); if (!$record) { return ['code' => 1, 'msg' => '记录不存在或无权删除']; } if ($record->status == 1) { return ['code' => 1, 'msg' => '待审核的记录不能删除']; } $record->mark = 0; $record->save(); return ['code' => 0, 'msg' => '删除成功']; } /** * 批量删除 * @param array $ids 记录ID数组 * @param int $currentUserId 当前用户的 member_id(member 表的 ID),用于数据隔离 */ public function deleteAll($ids = null, $currentUserId = null) { // 如果没有传入参数,从请求中获取 if ($ids === null) { $ids = request()->input('ids', []); } $query = BalanceLogModel::whereIn('id', $ids) ->where('mark', 1) ->where('status', '!=', 1); // 数据隔离:只能删除自己的记录(基于 member 表的 user_id) if ($currentUserId) { $query->where('user_id', $currentUserId); } $count = $query->update(['mark' => 0]); return [ 'code' => 0, 'msg' => "成功删除{$count}条记录" ]; } /** * 获取状态文本 */ private function getStatusText($status) { $statusMap = [ -1 => '已取消', 1 => '待审核', 2 => '已审核/到账', 3 => '审核失败' ]; return $statusMap[$status] ?? '未知'; } /** * 获取支付方式文本 */ private function getPayTypeText($payType) { $payTypeMap = [ 10 => '微信', 20 => '支付宝', 50 => '银行卡' ]; return $payTypeMap[$payType] ?? '未知'; } /** * 获取账户类型文本 */ private function getAccountTypeText($accountType) { $accountTypeMap = [ 1 => '会员', 2 => '代理', 3 => '商户' ]; return $accountTypeMap[$accountType] ?? '未知'; } /** * 获取代理等级文本 */ private function getAgentLevelText($level) { $levelMap = [ 1 => '一级代理', 2 => '二级代理', 3 => '三级代理' ]; return $levelMap[$level] ?? '未知'; } }