MatchexchangeAddValidation.php 3.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134
  1. <?php
  2. namespace App\Module\AppGame\Validations;
  3. use App\Module\Mex\Validators\MexOrderValidator;
  4. use App\Module\Mex\Validators\MexItemValidator;
  5. use App\Module\Mex\Logic\FundLogic;
  6. use Uraus\Kku\Common\MEX_DIRECTION;
  7. /**
  8. * 农贸市场添加挂单验证类
  9. *
  10. * 用于验证添加挂单请求的参数,包括物品、价格、数量等验证
  11. */
  12. class MatchexchangeAddValidation extends ValidationBase
  13. {
  14. /**
  15. * 验证规则
  16. *
  17. * @param array $rules 自定义规则
  18. * @return array
  19. */
  20. public function rules($rules = []): array
  21. {
  22. return [
  23. // 基础参数验证
  24. [
  25. 'user_id,itemId,price,num,direction', 'required'
  26. ],
  27. [
  28. 'user_id,itemId,num', 'integer', 'min' => 1,
  29. 'msg' => '{attr}必须是大于0的整数'
  30. ],
  31. [
  32. 'price', 'float', 'min' => '0.00001',
  33. 'msg' => '价格必须是大于0的数字'
  34. ],
  35. // 验证交易方向(支持字符串和整数两种格式)
  36. [
  37. 'direction', 'in', 'range' => [MEX_DIRECTION::BUY, MEX_DIRECTION::SELL],
  38. 'msg' => '交易方向无效'
  39. ],
  40. // 验证物品是否可交易
  41. [
  42. 'itemId', new MexItemValidator($this),
  43. 'msg' => '该物品不支持在农贸市场交易'
  44. ],
  45. // 注意:根据文档要求,挂单阶段无价格验证,价格验证延后到撮合阶段
  46. // 移除价格验证器,只保留基本的数值验证
  47. // 验证订单创建条件(资金和物品数量验证)
  48. [
  49. 'direction', new MexOrderValidator($this, ['user_id', 'itemId', 'num', 'price', 'currency_type']),
  50. 'msg' => '订单创建条件不满足'
  51. ]
  52. ];
  53. }
  54. /**
  55. * 设置默认值
  56. *
  57. * @return array
  58. */
  59. public function default(): array
  60. {
  61. return [];
  62. }
  63. /**
  64. * 数据预处理
  65. * 将 protobuf 枚举字符串转换为对应的整数值
  66. * 添加默认币种信息
  67. *
  68. * @return bool
  69. */
  70. public function beforeValidate(): bool
  71. {
  72. // 处理 direction 字段的转换
  73. $direction = $this->getRaw('direction');
  74. if (is_string($direction)) {
  75. // 将字符串枚举名转换为对应的整数值
  76. $directionValue = match(strtoupper($direction)) {
  77. 'SELL' => MEX_DIRECTION::SELL,
  78. 'BUY' => MEX_DIRECTION::BUY,
  79. 'DIRECTION_NONE' => MEX_DIRECTION::DIRECTION_NONE,
  80. default => $direction // 保持原值,让验证器处理
  81. };
  82. $this->setRaw('direction', $directionValue);
  83. }
  84. // 添加默认币种信息(钻石)用于验证
  85. // 由于protobuf请求中没有币种字段,我们使用默认币种
  86. $defaultCurrency = FundLogic::getDefaultCurrency();
  87. $this->setRaw('currency_type', $defaultCurrency->value);
  88. return true;
  89. }
  90. /**
  91. * 获取交易方向描述
  92. *
  93. * @return string
  94. */
  95. public function getDirectionText(): string
  96. {
  97. $direction = $this->getSafe('direction');
  98. return match($direction) {
  99. MEX_DIRECTION::BUY => '买入',
  100. MEX_DIRECTION::SELL => '卖出',
  101. default => '未知'
  102. };
  103. }
  104. /**
  105. * 是否为买入订单
  106. *
  107. * @return bool
  108. */
  109. public function isBuyOrder(): bool
  110. {
  111. return $this->getSafe('direction') === MEX_DIRECTION::BUY;
  112. }
  113. /**
  114. * 是否为卖出订单
  115. *
  116. * @return bool
  117. */
  118. public function isSellOrder(): bool
  119. {
  120. return $this->getSafe('direction') === MEX_DIRECTION::SELL;
  121. }
  122. }