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 { $money = $data['money'] ?? 0; $account = $data['account'] ?? ''; if($money<=0){ return [ 'code' => 1, 'msg' => '请输入提现金额' ]; } if(empty($account)){ return [ 'code' => 1, 'msg' => '请输入提现账户' ]; } $storeInfo = StoreModel::where(['user_id'=>$data['user_id']])->select(['id','balance','status']) ->first(); $balance = isset($storeInfo['balance'])?$storeInfo['balance'] : 0; $status = isset($storeInfo['status'])?$storeInfo['status'] : 0; if(empty($storeInfo) || $status != 1){ return [ 'code' => 1, 'msg' => '商家账户不存在或已冻结,请联系客服' ]; } if($balance<$money){ return [ 'code' => 1, 'msg' => '商家可提现余额不足' ]; } // 扣除余额 DB::beginTransaction(); if(!StoreModel::where(['user_id'=>$data['user_id']])->update(['balance'=>DB::raw("balance - {$money}"),'update_time'=>time()])){ DB::rollBack(); return [ 'code' => 1, 'msg' => '商家可提现余额不足' ]; } // 生成订单号 $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 = $money; $record->actual_money = $data['money'] ?? 0; // 默认实际到账等于申请金额 $record->pay_type = $data['pay_type'] ?? 10; $record->account = $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(); DB::commit(); 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()]; } } /** * 更新代理表的累计提现金额 */ 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] ?? '未知'; } }