MatchexchangeAddValidation.php 3.4 KB

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