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