validated(); // 验证完成 // 获取请求参数 $targetUserId = $validation->getSafe('user_id'); // 被偷的玩家ID $petId = $validation->getSafe('pet_id'); // 宠物ID $plantId = $validation->getSafe('plant_id'); // 作物ID $stealerId = $this->user_id; // 偷菜者用户ID // 创建响应对象 $response = new ResponsePetVegeteal(); try { // 开启事务执行偷菜操作 $stealResult = DB::transaction(function () use ($stealerId, $targetUserId, $plantId, $petId) { return PetStealService::stealCrop($stealerId, $targetUserId, $plantId, $petId); }); // 记录偷菜操作日志 Log::info('宠物偷菜操作', [ 'stealer_id' => $stealerId, 'target_user_id' => $targetUserId, 'pet_id' => $petId, 'plant_id' => $plantId, 'success' => $stealResult->success, 'defended' => $stealResult->defended, 'steal_amount' => $stealResult->stealAmount, 'item_id' => $stealResult->itemId, 'steal_log_id' => $stealResult->stealLogId, 'pick_log_id' => $stealResult->pickLogId, ]); // 根据偷菜结果设置响应 if ($stealResult->success) { // 偷菜成功 Log::info('偷菜成功', [ 'stealer_id' => $stealerId, 'target_user_id' => $targetUserId, 'steal_amount' => $stealResult->stealAmount, 'item_id' => $stealResult->itemId, ]); } elseif ($stealResult->defended) { // 被防御 - 抛出异常返回失败状态 Log::info('偷菜被防御', [ 'stealer_id' => $stealerId, 'target_user_id' => $targetUserId, 'stealer_pet_id' => $stealResult->stealerPetId, 'target_pet_id' => $stealResult->targetPetId, ]); throw new LogicException('偷菜被防御,偷菜失败'); } else { // 偷菜失败 Log::warning('偷菜失败', [ 'stealer_id' => $stealerId, 'target_user_id' => $targetUserId, 'fail_reason' => $stealResult->failReason, ]); throw new LogicException($stealResult->failReason ?? '偷菜失败'); } } catch (LogicException $e) { // 业务逻辑异常,记录日志并重新抛出 Log::warning('偷菜业务逻辑异常', [ 'stealer_id' => $stealerId, 'target_user_id' => $targetUserId, 'pet_id' => $petId, 'plant_id' => $plantId, 'error' => $e->getMessage(), 'trace' => $e->getTraceAsString(), ]); throw $e; } catch (\Exception $e) { // 其他异常,记录日志并重新抛出 Log::error('偷菜操作异常', [ 'stealer_id' => $stealerId, 'target_user_id' => $targetUserId, 'pet_id' => $petId, 'plant_id' => $plantId, 'error' => $e->getMessage(), 'trace' => $e->getTraceAsString(), ]); throw $e; } return $response; } }