getLandId(); $toolItemId = $data->getItemId() ?? 0; // 铲除工具ID,可选 $userId = $this->user_id; // 先进行验证,避免不必要的事务开销 $validation = new CropRemoveValidation([ 'user_id' => $userId, 'land_id' => $landId, 'tool_item_id' => $toolItemId ]); // 验证数据 $validation->validated(); try { // 验证通过后,开启事务 DB::beginTransaction(); // 调用铲除作物服务 $result = CropService::removeCrop($userId, $landId, $toolItemId); if (!$result['success']) { throw new LogicException("铲除作物失败,请检查土地状态"); } // 如果使用了工具,消耗工具并检查奖励 if ($toolItemId > 0) { // 先获取工具物品信息,检查是否有铲除奖励 $toolItem = Item::find($toolItemId); $rewardGroupId = 0; if ($toolItem && $toolItem->numeric_attributes) { $rewardGroupId = $toolItem->numeric_attributes->fram_remove_reward_group ?? 0; } // 消耗工具 ItemService::consumeItem($userId, $toolItemId, null, 1, [ 'source_type' => 'land_remove_crop', 'source_id' => $landId, 'details' => ['land_id' => $landId] ]); // 如果工具有铲除奖励,发放奖励 if ($rewardGroupId > 0) { try { $rewardResult = RewardService::grantReward( $userId, $rewardGroupId, REWARD_SOURCE_TYPE::LAND_REMOVE_CROP, $landId ); if ($rewardResult->success) { Log::info('铲除作物奖励发放成功', [ 'user_id' => $userId, 'land_id' => $landId, 'tool_item_id' => $toolItemId, 'reward_group_id' => $rewardGroupId, 'reward_items' => $rewardResult->items ]); } else { Log::warning('铲除作物奖励发放失败', [ 'user_id' => $userId, 'land_id' => $landId, 'tool_item_id' => $toolItemId, 'reward_group_id' => $rewardGroupId, 'error' => $rewardResult->errorMessage ]); } } catch (\Exception $e) { Log::error('铲除作物奖励发放异常', [ 'user_id' => $userId, 'land_id' => $landId, 'tool_item_id' => $toolItemId, 'reward_group_id' => $rewardGroupId, 'error' => $e->getMessage(), 'trace' => $e->getTraceAsString() ]); // 奖励发放失败不影响主流程,只记录日志 } } } // 提交事务 DB::commit(); // 如果土地状态发生变更,触发土地状态变更事件(在事务外) if ($result['status_changed']) { event(new \App\Module\Farm\Events\LandStatusChangedEvent( $userId, $landId, $result['old_status'], $result['new_status'] )); } Log::info('用户铲除作物成功', [ 'user_id' => $userId, 'land_id' => $landId, 'tool_item_id' => $toolItemId, 'status_changed' => $result['status_changed'], 'old_status' => $result['old_status'], 'new_status' => $result['new_status'], 'has_reward' => $toolItemId > 0 && isset($rewardGroupId) && $rewardGroupId > 0 ]); } catch (\Exception $e) { // 系统异常,需要回滚事务 if (DB::transactionLevel() > 0) { DB::rollBack(); } Log::error('铲除作物操作异常', [ 'user_id' => $userId ?? null, 'land_id' => $landId ?? null, 'tool_item_id' => $toolItemId ?? null, 'error' => $e->getMessage(), 'trace' => $e->getTraceAsString() ]); throw $e; } return $response; } }