FertilizerUsageValidator.php 2.7 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788
  1. <?php
  2. namespace App\Module\Farm\Validators;
  3. use App\Module\Farm\Enums\LAND_STATUS;
  4. use App\Module\Farm\Enums\GROWTH_STAGE;
  5. use App\Module\Farm\Models\FarmCrop;
  6. use Illuminate\Support\Facades\Log;
  7. use UCore\Validator;
  8. /**
  9. * 肥料使用验证器
  10. *
  11. * 验证土地和作物状态是否允许使用肥料
  12. */
  13. class FertilizerUsageValidator extends Validator
  14. {
  15. /**
  16. * 验证是否可以使用肥料
  17. *
  18. * @param mixed $value 土地ID
  19. * @param array $data 包含其他数据的数组
  20. * @return bool
  21. */
  22. public function validate(mixed $value, array $data): bool
  23. {
  24. try {
  25. Log::info('FertilizerUsageValidator开始验证', [
  26. 'land_id' => $value,
  27. 'data' => $data
  28. ]);
  29. // 获取土地对象
  30. $land = null;
  31. if (isset($this->args[0])) {
  32. $land = $this->validation->{$this->args[0]};
  33. }
  34. if (!$land) {
  35. Log::warning('FertilizerUsageValidator: 土地信息不存在', ['land_id' => $value]);
  36. $this->addError('土地信息不存在');
  37. return false;
  38. }
  39. // 检查土地状态是否为种植中
  40. if ($land->status !== LAND_STATUS::PLANTING->valueInt()) {
  41. $this->addError('土地状态不允许使用肥料');
  42. return false;
  43. }
  44. // 获取作物信息
  45. $crop = FarmCrop::where('land_id', $value)->first();
  46. Log::info('FertilizerUsageValidator: 查询作物信息', [
  47. 'land_id' => $value,
  48. 'crop_found' => $crop ? true : false,
  49. 'crop_id' => $crop ? $crop->id : null
  50. ]);
  51. if (!$crop) {
  52. Log::warning('FertilizerUsageValidator: 土地上没有作物', ['land_id' => $value]);
  53. $this->addError('土地上没有作物');
  54. return false;
  55. }
  56. // 检查作物生长阶段是否允许使用肥料
  57. if (!GROWTH_STAGE::canUseFertilizer($crop->growth_stage)) {
  58. $this->addError('当前生长阶段不能使用肥料');
  59. return false;
  60. }
  61. // 检查是否已经使用过肥料
  62. if ($crop->fertilized) {
  63. $this->addError('当前阶段已经使用过肥料');
  64. return false;
  65. }
  66. // 设置作物对象到验证类
  67. if (isset($this->args[1])) {
  68. $this->validation->{$this->args[1]} = $crop;
  69. }
  70. return true;
  71. } catch (\Exception $e) {
  72. $this->addError('验证肥料使用条件时发生错误:' . $e->getMessage());
  73. return false;
  74. }
  75. }
  76. }