<?php
class AuctionItem { public $auctionId; public $itemId; public $sellerId; public $currentBid; public $currentBidder; public $minIncrement; public $endTime; public $version; public function __construct($auctionId, $itemId, $sellerId, $startPrice, $minIncrement, $duration) { $this->auctionId = $auctionId; $this->itemId = $itemId; $this->sellerId = $sellerId; $this->currentBid = $startPrice; $this->currentBidder = null; $this->minIncrement = $minIncrement; $this->endTime = time() + $duration; $this->version = 0; } }
class AuctionHouseSystem { private $occManager; private $activeAuctions; public function __construct() { $this->occManager = new OptimisticConcurrencyManager(); $this->activeAuctions = []; }
public function createAuction($sellerId, $itemId, $startPrice, $minIncrement, $duration = 3600) { $auctionId = uniqid('auction_'); $auctionItem = new AuctionItem($auctionId, $itemId, $sellerId, $startPrice, $minIncrement, $duration); $key = "auction_{$auctionId}"; $this->occManager->initializeData($key, $auctionItem); $this->activeAuctions[$auctionId] = $key; echo "拍卖创建成功: {$auctionId}, 物品: {$itemId}, 起拍价: {$startPrice}\n"; return $auctionId; }
public function placeBid($bidderId, $auctionId, $bidAmount) { $key = "auction_{$auctionId}"; $transactionId = $this->occManager->beginTransaction("bid_{$bidderId}_{$auctionId}"); try { $auction = $this->occManager->transactionRead($transactionId, $key); if (time() > $auction->endTime) { $this->occManager->abort($transactionId); return [ 'success' => false, 'message' => "拍卖已结束" ]; } if ($bidAmount < $auction->currentBid + $auction->minIncrement) { $this->occManager->abort($transactionId); return [ 'success' => false, 'message' => "出价必须至少为 " . ($auction->currentBid + $auction->minIncrement) ]; } if (!$this->checkBidderFunds($bidderId, $bidAmount)) { $this->occManager->abort($transactionId); return [ 'success' => false, 'message' => "资金不足" ]; } $previousBidder = $auction->currentBidder; $previousBid = $auction->currentBid; $auction->currentBid = $bidAmount; $auction->currentBidder = $bidderId; $this->occManager->transactionWrite($transactionId, $key, $auction); $this->occManager->commit($transactionId); echo "玩家 {$bidderId} 对拍卖 {$auctionId} 出价 {$bidAmount}\n"; if ($previousBidder) { $this->refundBidder($previousBidder, $previousBid); } return [ 'success' => true, 'message' => "出价成功", 'current_bid' => $bidAmount, 'is_leading' => true ]; } catch (OptimisticConcurrencyException $e) { $this->occManager->abort($transactionId); echo "玩家 {$bidderId} 出价失败:版本冲突,正在重试...\n"; return $this->placeBidWithRetry($bidderId, $auctionId, $bidAmount, 3); } catch (Exception $e) { $this->occManager->abort($transactionId); return [ 'success' => false, 'message' => "出价失败: " . $e->getMessage() ]; } }
private function placeBidWithRetry($bidderId, $auctionId, $bidAmount, $maxRetries) { $retryCount = 0; while ($retryCount < $maxRetries) { try { return $this->placeBid($bidderId, $auctionId, $bidAmount); } catch (OptimisticConcurrencyException $e) { $retryCount++; echo "重试 {$retryCount}/{$maxRetries}...\n"; $currentBid = $this->getCurrentBid($auctionId); if ($bidAmount < $currentBid + $this->getMinIncrement($auctionId)) { $bidAmount = $currentBid + $this->getMinIncrement($auctionId); echo "自动调整出价为: {$bidAmount}\n"; } if ($retryCount < $maxRetries) { usleep(100000 * $retryCount); } } } return [ 'success' => false, 'message' => "出价失败:多次重试后仍存在冲突" ]; }
public function endAuction($auctionId) { $key = "auction_{$auctionId}"; $transactionId = $this->occManager->beginTransaction("end_auction_{$auctionId}"); try { $auction = $this->occManager->transactionRead($transactionId, $key); if (time() < $auction->endTime) { $this->occManager->abort($transactionId); return [ 'success' => false, 'message' => "拍卖尚未结束" ]; } if ($auction->currentBidder) { $this->transferItem($auction->sellerId, $auction->currentBidder, $auction->itemId); $this->transferFunds($auction->currentBidder, $auction->sellerId, $auction->currentBid); echo "拍卖 {$auctionId} 结束,获胜者: {$auction->currentBidder}, 价格: {$auction->currentBid}\n"; $result = [ 'success' => true, 'winner' => $auction->currentBidder, 'final_price' => $auction->currentBid, 'message' => "拍卖结束,物品已转移给获胜者" ]; } else { echo "拍卖 {$auctionId} 结束,无出价\n"; $result = [ 'success' => true, 'winner' => null, 'message' => "拍卖结束,无获胜者" ]; } unset($this->activeAuctions[$auctionId]); $this->occManager->commit($transactionId); return $result; } catch (Exception $e) { $this->occManager->abort($transactionId); return [ 'success' => false, 'message' => "结束拍卖失败: " . $e->getMessage() ]; } } private function checkBidderFunds($bidderId, $amount) { return true; } private function refundBidder($bidderId, $amount) { echo "退还玩家 {$bidderId} 的资金: {$amount}\n"; } private function transferItem($fromPlayer, $toPlayer, $itemId) { echo "将物品 {$itemId} 从 {$fromPlayer} 转移给 {$toPlayer}\n"; } private function transferFunds($fromPlayer, $toPlayer, $amount) { echo "将 {$amount} 资金从 {$fromPlayer} 转移给 {$toPlayer}\n"; } private function getCurrentBid($auctionId) { try { $key = "auction_{$auctionId}"; $data = $this->occManager->read($key); return $data['data']->currentBid; } catch (Exception $e) { return 0; } } private function getMinIncrement($auctionId) { try { $key = "auction_{$auctionId}"; $data = $this->occManager->read($key); return $data['data']->minIncrement; } catch (Exception $e) { return 1; } }
public function getActiveAuctions() { $auctions = []; foreach ($this->activeAuctions as $auctionId => $key) { try { $data = $this->occManager->read($key); $auction = $data['data']; if (time() <= $auction->endTime) { $auctions[] = [ 'auction_id' => $auction->auctionId, 'item_id' => $auction->itemId, 'current_bid' => $auction->currentBid, 'current_bidder' => $auction->currentBidder, 'end_time' => $auction->endTime, 'time_remaining' => $auction->endTime - time() ]; } } catch (Exception $e) { unset($this->activeAuctions[$auctionId]); } } return $auctions; } }
?>
|