MexItemValidator.php 3.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128
  1. <?php
  2. namespace App\Module\Mex\Validators;
  3. use App\Module\GameItems\Services\ItemService;
  4. use App\Module\Mex\Services\MexPriceConfigService;
  5. use UCore\Validator;
  6. use Illuminate\Support\Facades\Log;
  7. /**
  8. * 农贸市场物品验证器
  9. *
  10. * 验证物品是否可以在农贸市场进行交易
  11. */
  12. class MexItemValidator extends Validator
  13. {
  14. /**
  15. * 验证物品是否可交易
  16. *
  17. * @param mixed $value 物品ID
  18. * @param array $data 所有数据
  19. * @return bool 验证是否通过
  20. */
  21. public function validate(mixed $value, array $data): bool
  22. {
  23. $itemId = (int)$value;
  24. try {
  25. // 验证物品是否存在
  26. if (!$this->validateItemExists($itemId)) {
  27. return false;
  28. }
  29. // 验证物品是否配置了交易价格
  30. if (!$this->validateItemPriceConfig($itemId)) {
  31. return false;
  32. }
  33. // 验证物品是否允许交易
  34. if (!$this->validateItemTradeable($itemId)) {
  35. return false;
  36. }
  37. return true;
  38. } catch (\Exception $e) {
  39. Log::error('农贸市场物品验证失败', [
  40. 'item_id' => $itemId,
  41. 'error' => $e->getMessage()
  42. ]);
  43. $this->addError('物品验证时发生错误');
  44. return false;
  45. }
  46. }
  47. /**
  48. * 验证物品是否存在
  49. *
  50. * @param int $itemId 物品ID
  51. * @return bool
  52. */
  53. private function validateItemExists(int $itemId): bool
  54. {
  55. $item = ItemService::getItemInfo($itemId);
  56. if (!$item) {
  57. $this->addError('物品不存在');
  58. return false;
  59. }
  60. return true;
  61. }
  62. /**
  63. * 验证物品是否配置了交易价格
  64. *
  65. * @param int $itemId 物品ID
  66. * @return bool
  67. */
  68. private function validateItemPriceConfig(int $itemId): bool
  69. {
  70. $priceConfig = MexPriceConfigService::getItemPriceConfig($itemId);
  71. if (!$priceConfig) {
  72. $this->addError('该物品未配置交易价格,不支持交易');
  73. return false;
  74. }
  75. // 检查价格配置是否有效
  76. if ($priceConfig['min_price'] <= 0 || $priceConfig['max_price'] <= 0) {
  77. $this->addError('物品价格配置无效');
  78. return false;
  79. }
  80. if ($priceConfig['min_price'] > $priceConfig['max_price']) {
  81. $this->addError('物品价格配置错误:最小价格大于最大价格');
  82. return false;
  83. }
  84. return true;
  85. }
  86. /**
  87. * 验证物品是否允许交易
  88. *
  89. * @param int $itemId 物品ID
  90. * @return bool
  91. */
  92. private function validateItemTradeable(int $itemId): bool
  93. {
  94. // 获取物品信息
  95. $item = ItemService::getItemInfo($itemId);
  96. if (!$item) {
  97. $this->addError('物品信息获取失败');
  98. return false;
  99. }
  100. // 检查物品是否标记为可交易
  101. // 这里可以根据实际的物品属性来判断
  102. // 例如检查 tradeable 字段或其他标识
  103. // 暂时允许所有有价格配置的物品交易
  104. // 后续可以根据需求添加更多限制条件
  105. return true;
  106. }
  107. }