getGoodId(); $number = $data->getNumber(); $userId = $this->user_id; // 先进行验证,避免不必要的事务开销 $validation = new ShopBuyValidation([ 'user_id' => $userId, 'good_id' => $goodId, 'number' => $number ]); // 验证数据 $validation->validated(); // 从验证结果中获取商品信息 $shopItem = $validation->shop_item; // 验证通过后,开启事务 DB::beginTransaction(); // 执行消耗组逻辑(如果商品有消耗组) // 支持购买多个数量 $consumeResult = ConsumeService::executeConsume( $userId, $shopItem->consume_group_id, REWARD_SOURCE_TYPE::SHOP_PURCHASE, $goodId, false,// 不重复检查,因为验证阶段已经检查过 $number ); if (!$consumeResult->success) { throw new LogicException("消耗资源失败:" . $consumeResult->message); } // 支持购买多个数量 $rewardResult = RewardService::grantReward( $userId, $shopItem->reward_group_id, REWARD_SOURCE_TYPE::SHOP_PURCHASE, $goodId, $number ); if (!$rewardResult->success) { throw new LogicException("发放奖励失败:" . $rewardResult->errorMessage); } // 记录购买记录(总价暂时设为0,因为不再有固定价格) $shopItem->recordPurchase($userId, $number, 0); // 更新限购计数 $shopItem->updatePurchaseLimitCounters($userId, $number); // 提交事务 DB::commit(); // 记录日志 Log::info('用户购买商品成功', [ 'user_id' => $userId, 'good_id' => $goodId, 'number' => $number, 'consume_group_id' => $shopItem->consume_group_id, 'reward_group_id' => $shopItem->reward_group_id, 'shop_item_name' => $shopItem->name, 'has_consume_group' => !empty($shopItem->consume_group_id), 'has_reward_group' => !empty($shopItem->reward_group_id) ]); } catch (\Exception $e) { // 系统异常,需要回滚事务 if (DB::transactionLevel() > 0) { DB::rollBack(); } Logger::exception('购买商品操作异常', $e, [ 'user_id' => $userId ?? null, 'good_id' => $goodId ?? null, 'number' => $number ?? null, ]); // 重新抛出异常,交由框架处理 throw $e; } return $response; } }