FarmCropController.php 9.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246
  1. <?php
  2. namespace App\Module\Farm\AdminControllers;
  3. use App\Module\Farm\AdminControllers\Helper\FilterHelper;
  4. use App\Module\Farm\AdminControllers\Helper\FormHelper;
  5. use App\Module\Farm\AdminControllers\Helper\GridHelper;
  6. use App\Module\Farm\AdminControllers\Helper\ShowHelper;
  7. use App\Module\Farm\Enums\GROWTH_STAGE;
  8. use App\Module\Farm\Repositories\FarmCropRepository;
  9. use App\Module\Farm\Repositories\FarmSeedRepository;
  10. use Dcat\Admin\Form;
  11. use Dcat\Admin\Grid;
  12. use Dcat\Admin\Show;
  13. use UCore\DcatAdmin\AdminController;
  14. use Spatie\RouteAttributes\Attributes\Resource;
  15. use Spatie\RouteAttributes\Attributes\Post;
  16. /**
  17. * 作物管理控制器
  18. */
  19. #[Resource('farm-crops', names: 'dcat.admin.farm-crops')]
  20. class FarmCropController extends AdminController
  21. {
  22. /**
  23. * 页面标题
  24. *
  25. * @var string
  26. */
  27. protected $title = '作物管理';
  28. /**
  29. * 页面描述
  30. *
  31. * @var string
  32. */
  33. protected $description = '管理用户种植的作物';
  34. /**
  35. * 构建表格
  36. *
  37. * @return Grid
  38. */
  39. protected function grid()
  40. {
  41. return Grid::make(new FarmCropRepository(['final_output_item']), function (Grid $grid) {
  42. $helper = new GridHelper($grid, $this);
  43. $helper->columnId();
  44. $grid->column('land_id', '土地ID')->sortable();
  45. $helper->columnUserId();
  46. $grid->column('seed_id', '种子ID')->sortable();
  47. $grid->column('land_level', '土地等级')->sortable()->display(function ($value) {
  48. $landType = \App\Module\Farm\Models\FarmLandType::find($value);
  49. $typeName = $landType ? $landType->name : '未知';
  50. return "<span class='badge badge-info'>{$typeName}({$value})</span>";
  51. });
  52. $grid->column('plant_time', '种植时间')->sortable();
  53. $helper->columnUseingEnmu('growth_stage', \App\Module\Farm\Enums\GROWTH_STAGE::class,'生长阶段');
  54. $grid->column('stage_end_time', '阶段结束时间')->sortable();
  55. // 添加产出相关字段
  56. $grid->column('final_output_item_id', '产出物品ID')->sortable()->display(function ($value) {
  57. if ($value) {
  58. return "<span class='label label-success'>{$value}</span>";
  59. }
  60. return "<span class='label label-warning'>未确定</span>";
  61. });
  62. $grid->column('final_output_item.name', '产出物品')->sortable()->display(function ($value) {
  63. if ($value) {
  64. return "<span class='label label-success'>{$value}</span>";
  65. }
  66. return "<span class='label label-warning'>-</span>";
  67. });
  68. $grid->column('final_output_amount', '预定产量')->sortable()->display(function ($value) {
  69. if ($value) {
  70. return "<span class='label label-info'>{$value}</span>";
  71. }
  72. return "<span class='label --warning'>未确定</span>";
  73. });
  74. $helper->columnFertilized();
  75. $helper->columnCreatedAt();
  76. $helper->columnUpdatedAt();
  77. $grid->filter(function (Grid\Filter $filter) {
  78. $filterHelper = new FilterHelper($filter, $this);
  79. $filter->scope('trashed', '回收站')->onlyTrashed();
  80. $filterHelper->equalId();
  81. $filter->equal('land_id', '土地ID');
  82. $filterHelper->equalUserId();
  83. $filter->equal('seed_id', '种子ID');
  84. $filterHelper->equalGrowthStage();
  85. $filterHelper->equalLandType('land_level'); // land_level
  86. $filterHelper->betweenDatetime('plant_time', '种植时间');
  87. $filterHelper->betweenDatetime('stage_end_time', '阶段结束时间');
  88. // 添加产出相关过滤器
  89. $filter->equal('final_output_item_id', '产出物品ID');
  90. $filter->where('output_status', function ($query) {
  91. $value = $this->input;
  92. if ($value == 'has_amount') {
  93. $query->whereNotNull('final_output_amount');
  94. } elseif ($value == 'no_amount') {
  95. $query->whereNull('final_output_amount');
  96. }
  97. }, '产量状态')->select([
  98. 'has_amount' => '已确定产量',
  99. 'no_amount' => '未确定产量'
  100. ]);
  101. $filterHelper->equalFertilized();
  102. $filterHelper->betweenDatetime('created_at', '创建时间');
  103. });
  104. });
  105. }
  106. /**
  107. * 构建详情页
  108. *
  109. * @param mixed $id
  110. * @return Show
  111. */
  112. protected function detail($id)
  113. {
  114. return Show::make($id, new FarmCropRepository(), function (Show $show) {
  115. $helper = new ShowHelper($show, $this);
  116. $show->field('id', 'ID');
  117. $show->field('land_id', '土地ID');
  118. $helper->fieldUserId('user_id', '用户ID');
  119. $show->field('seed_id', '种子ID');
  120. $show->field('land_level', '土地等级')->as(function ($value) {
  121. $landType = \App\Module\Farm\Models\FarmLandType::find($value);
  122. $typeName = $landType ? $landType->name : '未知';
  123. return "<span class='badge badge-info'>{$typeName}({$value})</span>";
  124. });
  125. $show->field('plant_time', '种植时间');
  126. $helper->fieldGrowthStage('growth_stage', '生长阶段');
  127. $show->field('stage_end_time', '阶段结束时间');
  128. // 添加产出相关字段(增强版本)
  129. $show->field('final_output_item_id', '产出物品ID')->as(function ($value) {
  130. return $value ? "<span class='label label-success'>{$value}</span>" : "<span class='label label-warning'>未确定</span>";
  131. });
  132. $show->field('final_output_amount', '预定产量')->as(function ($value) {
  133. return $value ? "<span class='label label-info'>{$value}</span>" : "<span class='label label-warning'>未确定</span>";
  134. });
  135. // 添加数据完整性状态
  136. $show->field('data_status', '数据状态')->as(function () {
  137. $hasItemId = !empty($this->final_output_item_id);
  138. $hasAmount = !empty($this->final_output_amount);
  139. $isMature = $this->growth_stage == GROWTH_STAGE::MATURE->value;
  140. if ($isMature) {
  141. if ($hasItemId && $hasAmount) {
  142. return "<span class='label label-success'>数据完整,可正常收获</span>";
  143. } elseif ($hasItemId) {
  144. return "<span class='label label-warning'>缺少产量,需要修复</span>";
  145. } else {
  146. return "<span class='label label-danger'>缺少产出物品ID,严重错误</span>";
  147. }
  148. } else {
  149. if ($hasItemId) {
  150. return "<span class='label label-info'>已确定产出物品,等待成熟期确定产量</span>";
  151. } else {
  152. return "<span class='label label-default'>等待发芽期确定产出物品</span>";
  153. }
  154. }
  155. });
  156. // 使用新的灾害显示方法
  157. $show->fieldModelCatsJson2('disasters', '灾害情况');
  158. $helper->fieldFertilized('fertilized', '已施肥');
  159. $show->field('created_at', '创建时间');
  160. $show->field('updated_at', '更新时间');
  161. });
  162. }
  163. /**
  164. * 构建表单
  165. *
  166. * @return Form
  167. */
  168. protected function form()
  169. {
  170. return Form::make(new FarmCropRepository(), function (Form $form) {
  171. $helper = new FormHelper($form, $this);
  172. $form->display('id', 'ID');
  173. $form->text('land_id', '土地ID')->required()->rules('required|integer');
  174. $helper->display('user_id', '用户ID');
  175. // 获取所有种子选项
  176. $form->display('seed_id', '种子ID');
  177. // 土地等级字段
  178. $form->select('land_level', '土地等级')
  179. ->options(\App\Module\Farm\Models\FarmLandType::pluck('name', 'id')->toArray())
  180. ->help('种植时记录的土地等级,用于产出计算');
  181. $form->datetime('plant_time', '种植时间')->required();
  182. $helper->selectOptionCast('growth_stage', '生长阶段');
  183. $form->datetime('stage_end_time', '阶段结束时间');
  184. // 添加产出相关字段
  185. $form->number('final_output_item_id', '产出物品ID')
  186. ->help('发芽期自动确定,也可手动设置');
  187. $form->number('final_output_amount', '预定产量')
  188. ->min(1)
  189. ->help('成熟期自动计算,也可手动设置。注意:手动设置后收获时会直接使用此产量');
  190. // 添加数据状态提示
  191. $form->html('<div class="alert alert-info">
  192. <h4>产出数据说明:</h4>
  193. <ul>
  194. <li><strong>产出物品ID</strong>:在发芽期自动确定,决定收获什么物品</li>
  195. <li><strong>预定产量</strong>:在成熟期自动计算,决定收获数量</li>
  196. <li><strong>成熟期作物</strong>:必须有完整的产出数据才能正常收获</li>
  197. <li><strong>修复建议</strong>:如果数据不完整,请运行修复命令:<code>php artisan farm:fix-crop-mature-output</code></li>
  198. </ul>
  199. </div>');
  200. $helper->display('disasters', '灾害情况');
  201. $helper->switchFertilized();
  202. $form->display('created_at', '创建时间');
  203. $form->display('updated_at', '更新时间');
  204. });
  205. }
  206. }