ListHandler.php 4.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125
  1. <?php
  2. namespace App\Module\AppGame\Handler\Matchexchange;
  3. use App\Module\AppGame\Handler\BaseHandler;
  4. use App\Module\Mex\Services\MexTransactionService;
  5. use App\Module\Mex\Services\MexPriceConfigService;
  6. use App\Module\User\Services\Online;
  7. use Google\Protobuf\Internal\Message;
  8. use Uraus\Kku\Request\RequestMatchexchangeList;
  9. use Uraus\Kku\Response\ResponseMatchexchangeList;
  10. use Uraus\Kku\Response\MatchexchangeItem;
  11. use Uraus\Kku\Response\ResponseMatchexchangePrice;
  12. use Uraus\Kku\Common\ResponsePage;
  13. use Uraus\Kku\Common\MEX_DIRECTION;
  14. use Uraus\Kku\Common\MEX_STATUS;
  15. use Uraus\Kku\Common\RESPONSE_CODE;
  16. use Illuminate\Support\Facades\Log;
  17. /**
  18. * 处理获取成交列表请求(交易大厅)
  19. */
  20. class ListHandler extends BaseHandler
  21. {
  22. /**
  23. * 是否需要登录
  24. *
  25. * @var bool
  26. */
  27. protected bool $need_login = true;
  28. /**
  29. * 处理获取成交列表请求
  30. *
  31. * @param RequestMatchexchangeList $data 获取成交列表请求数据
  32. * @return ResponseMatchexchangeList 获取成交列表响应
  33. */
  34. public function handle(Message $data): Message
  35. {
  36. // 创建响应对象
  37. $response = new ResponseMatchexchangeList();
  38. // 获取请求参数
  39. $itemId = $data->getItemId() ?: null;
  40. $direction = $data->getDirection();
  41. $page = $data->getPage();
  42. // 解析分页参数
  43. $pageNum = $page ? $page->getPage() : 1;
  44. $pageSize = $page ? $page->getPerPage() : 20;
  45. // 确保分页参数有效,防止除零错误
  46. $pageSize = $pageSize > 0 ? $pageSize : 20;
  47. $pageNum = $pageNum > 0 ? $pageNum : 1;
  48. // 限制分页大小
  49. $pageSize = min($pageSize, 100);
  50. $pageNum = max($pageNum, 1);
  51. // 调用服务获取成交记录列表
  52. $result = MexTransactionService::getPublicTransactions($pageNum, $pageSize, $itemId);
  53. // 设置分页信息
  54. $responsePage = new ResponsePage();
  55. $responsePage->setCurrentPage($pageNum);
  56. $responsePage->setPerPage($pageSize);
  57. $responsePage->setTotal($result['total'] ?? 0);
  58. $lastPage = ceil(($result['total'] ?? 0) / $pageSize);
  59. $responsePage->setLastPage($lastPage);
  60. $responsePage->setHasMore($pageNum < $lastPage);
  61. $response->setPage($responsePage);
  62. // 转换成交记录数据
  63. $items = [];
  64. foreach ($result['transactions'] ?? [] as $transaction) {
  65. $item = new MatchexchangeItem();
  66. $item->setId($transaction['id']);
  67. $item->setUserId($transaction['user_id']);
  68. $item->setItemId($transaction['item_id']);
  69. $item->setPrice($transaction['price']);
  70. $item->setNum($transaction['quantity']);
  71. $item->setTimes(strtotime($transaction['created_at']));
  72. // 设置状态(成交记录都是已完成状态)
  73. $item->setStatus(MEX_STATUS::MEX_STATUS_FINISHED);
  74. // 设置方向(根据交易类型判断)
  75. if (isset($transaction['transaction_type'])) {
  76. $direction = ($transaction['transaction_type'] === 'USER_SELL')
  77. ? MEX_DIRECTION::SELL
  78. : MEX_DIRECTION::BUY;
  79. $item->setDirection($direction);
  80. } else {
  81. $item->setDirection(MEX_DIRECTION::DIRECTION_NONE);
  82. }
  83. $items[] = $item;
  84. }
  85. $response->setList($items);
  86. // 获取价格配置信息(如果指定了商品ID)
  87. if ($itemId) {
  88. $priceConfig = MexPriceConfigService::getItemPriceConfig($itemId);
  89. if ($priceConfig) {
  90. $priceInfo = new ResponseMatchexchangePrice();
  91. $priceInfo->setItemId($itemId);
  92. $priceInfo->setMinPrice($priceConfig['min_price']);
  93. $priceInfo->setMaxPrice($priceConfig['max_price']);
  94. // 获取平均价格(从最近成交记录计算)
  95. $latestPrice = MexTransactionService::getLatestPrice($itemId);
  96. if ($latestPrice) {
  97. $priceInfo->setAvgPrice(floatval($latestPrice));
  98. }
  99. $response->setPrice($priceInfo);
  100. }
  101. }
  102. return $response;
  103. }
  104. }