PickAmountValidator.php 1.4 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647
  1. <?php
  2. namespace App\Module\Farm\Validators;
  3. use App\Module\Farm\Models\FarmCrop;
  4. use UCore\Validation\BaseValidator;
  5. /**
  6. * 摘取数量验证器
  7. * 验证摘取数量是否合理
  8. */
  9. class PickAmountValidator extends BaseValidator
  10. {
  11. /**
  12. * 验证摘取数量
  13. *
  14. * @param FarmCrop $crop 作物模型
  15. * @param int $pickAmount 摘取数量
  16. * @return bool
  17. */
  18. public function validate(FarmCrop $crop, int $pickAmount): bool
  19. {
  20. // 检查摘取数量是否超过当前可摘取数量
  21. if ($pickAmount > $crop->pickable_amount) {
  22. $this->addError("摘取数量({$pickAmount})超过可摘取数量({$crop->pickable_amount})");
  23. return false;
  24. }
  25. // 检查单次摘取比例是否超过配置限制
  26. $maxRatio = $crop->seed->pick_max_ratio ?? 0.3; // 默认最大30%
  27. $pickRatio = $pickAmount / $crop->final_output_amount;
  28. if ($pickRatio > $maxRatio) {
  29. $maxAmount = (int)($crop->final_output_amount * $maxRatio);
  30. $this->addError("单次摘取比例({$pickRatio})超过限制({$maxRatio}),最多可摘取{$maxAmount}个");
  31. return false;
  32. }
  33. // 验证摘取数量的合理性(必须大于0)
  34. if ($pickAmount <= 0) {
  35. $this->addError('摘取数量必须大于0');
  36. return false;
  37. }
  38. return true;
  39. }
  40. }