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); if (!$result['success']) { throw new LogicException("铲除作物失败,请检查土地状态"); } // 如果使用了工具,消耗工具 if ($toolItemId > 0) { ItemService::consumeItem($userId, $toolItemId, null, 1, [ 'source_type' => 'land_remove_crop', 'source_id' => $landId, 'details' => ['land_id' => $landId] ]); } // 提交事务 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'] ]); } catch (\Exception $e) { // 系统异常,需要回滚事务 if (DB::transactionLevel() > 0) { DB::rollBack(); } $this->response->setCode(500); $this->response->setMsg('系统错误,请稍后再试'); Log::error('铲除作物操作异常', [ 'user_id' => $userId ?? null, 'land_id' => $landId ?? null, 'tool_item_id' => $toolItemId ?? null, 'error' => $e->getMessage(), 'trace' => $e->getTraceAsString() ]); } return $response; } }