Prechádzať zdrojové kódy

[Farm模块] 自动提交 - 2025/5/12

Your Name 8 mesiacov pred
rodič
commit
9b2a198160

+ 43 - 0
app/Module/Farm/AdminControllers/Actions/CopyAction.php

@@ -0,0 +1,43 @@
+<?php
+
+namespace App\Module\Farm\AdminControllers\Actions;
+
+use App\Module\Farm\Models\FarmSeedOutput;
+use Dcat\Admin\Grid\RowAction;
+use Illuminate\Http\Request;
+
+class CopyAction extends RowAction
+{
+    protected $title = '复制';
+
+    public function title()
+    {
+        return $this->title;
+    }
+
+    public function handle(Request $request)
+    {
+        try {
+            $id = $this->getKey();
+            
+            // 查找原始记录
+            $original = FarmSeedOutput::findOrFail($id);
+            
+            // 创建新记录
+            $new = $original->replicate();
+            $new->save();
+            
+            return $this->response()
+                ->success("复制成功 [ID: {$new->id}]")
+                ->refresh();
+        } catch (\Exception $e) {
+            return $this->response()
+                ->error('复制失败: '.$e->getMessage());
+        }
+    }
+
+    public function confirm()
+    {
+        return ['确定要复制此种子产出配置吗?', '复制操作将创建一个新的种子产出配置记录'];
+    }
+}

+ 14 - 8
app/Module/Farm/AdminControllers/FarmHarvestLogController.php

@@ -2,7 +2,9 @@
 
 namespace App\Module\Farm\AdminControllers;
 
+use App\Module\Farm\AdminControllers\Helper\FilterHelper;
 use App\Module\Farm\AdminControllers\Helper\GridHelper;
+use App\Module\Farm\AdminControllers\Helper\ShowHelper;
 use App\Module\Farm\Repositories\FarmHarvestLogRepository;
 use Dcat\Admin\Grid;
 use Dcat\Admin\Show;
@@ -39,23 +41,25 @@ class FarmHarvestLogController extends AdminController
         return Grid::make(new FarmHarvestLogRepository(), function (Grid $grid) {
             $helper = new GridHelper($grid, $this);
 
-            $grid->column('id', 'ID')->sortable();
-            $grid->column('user_id', '用户ID')->sortable();
+            $helper->columnId();
+            $helper->columnUserId();
             $grid->column('land_id', '土地ID')->sortable();
             $grid->column('crop_id', '作物ID')->sortable();
             $grid->column('seed_id', '种子ID')->sortable();
             $grid->column('output_amount', '产出数量')->sortable();
             $grid->column('harvest_time', '收获时间')->sortable();
-            $grid->column('created_at', '创建时间')->sortable();
+            $helper->columnCreatedAt();
 
             $grid->filter(function (Grid\Filter $filter) {
-                $filter->equal('id', 'ID');
-                $filter->equal('user_id', '用户ID');
+                $filterHelper = new FilterHelper($filter, $this);
+
+                $filterHelper->equalId();
+                $filterHelper->equalUserId();
                 $filter->equal('land_id', '土地ID');
                 $filter->equal('crop_id', '作物ID');
                 $filter->equal('seed_id', '种子ID');
-                $filter->between('harvest_time', '收获时间')->datetime();
-                $filter->between('created_at', '创建时间')->datetime();
+                $filterHelper->betweenDatetime('harvest_time', '收获时间');
+                $filterHelper->betweenDatetime('created_at', '创建时间');
             });
 
             $grid->disableCreateButton();
@@ -77,8 +81,10 @@ class FarmHarvestLogController extends AdminController
     protected function detail($id)
     {
         return Show::make($id, new FarmHarvestLogRepository(), function (Show $show) {
+            $helper = new ShowHelper($show, $this);
+
             $show->field('id', 'ID');
-            $show->field('user_id', '用户ID');
+            $helper->fieldUserId('user_id', '用户ID');
             $show->field('land_id', '土地ID');
             $show->field('crop_id', '作物ID');
             $show->field('seed_id', '种子ID');

+ 16 - 7
app/Module/Farm/AdminControllers/FarmHouseConfigController.php

@@ -2,7 +2,10 @@
 
 namespace App\Module\Farm\AdminControllers;
 
+use App\Module\Farm\AdminControllers\Helper\FilterHelper;
+use App\Module\Farm\AdminControllers\Helper\FormHelper;
 use App\Module\Farm\AdminControllers\Helper\GridHelper;
+use App\Module\Farm\AdminControllers\Helper\ShowHelper;
 use App\Module\Farm\Repositories\FarmHouseConfigRepository;
 use Dcat\Admin\Form;
 use Dcat\Admin\Grid;
@@ -40,20 +43,22 @@ class FarmHouseConfigController extends AdminController
         return Grid::make(new FarmHouseConfigRepository(), function (Grid $grid) {
             $helper = new GridHelper($grid, $this);
 
-            $grid->column('id', 'ID')->sortable();
+            $helper->columnId();
             $grid->column('level', '等级')->sortable();
             $grid->column('output_bonus', '产出加成')->display(function ($value) {
                 return ($value * 100) . '%';
             })->sortable();
             $grid->column('special_land_limit', '特殊土地上限')->sortable();
             $grid->column('downgrade_days', '降级天数')->sortable();
-            $grid->column('created_at', '创建时间')->sortable();
-            $grid->column('updated_at', '更新时间')->sortable();
+            $helper->columnCreatedAt();
+            $helper->columnUpdatedAt();
 
             $grid->filter(function (Grid\Filter $filter) {
-                $filter->equal('id', 'ID');
+                $filterHelper = new FilterHelper($filter, $this);
+
+                $filterHelper->equalId();
                 $filter->equal('level', '等级');
-                $filter->between('created_at', '创建时间')->datetime();
+                $filterHelper->betweenDatetime('created_at', '创建时间');
             });
 
             $grid->actions(function (Grid\Displayers\Actions $actions) {
@@ -71,13 +76,15 @@ class FarmHouseConfigController extends AdminController
     protected function detail($id)
     {
         return Show::make($id, new FarmHouseConfigRepository(), function (Show $show) {
+            $helper = new ShowHelper($show, $this);
+
             $show->field('id', 'ID');
             $show->field('level', '等级');
             $show->field('output_bonus', '产出加成')->as(function ($value) {
                 return ($value * 100) . '%';
             });
             $show->field('special_land_limit', '特殊土地上限');
-            $show->field('upgrade_materials', '升级所需材料')->json();
+            $helper->fieldModelCatsJson('upgrade_materials', '升级所需材料');
             $show->field('downgrade_days', '降级天数');
             $show->field('created_at', '创建时间');
             $show->field('updated_at', '更新时间');
@@ -92,11 +99,13 @@ class FarmHouseConfigController extends AdminController
     protected function form()
     {
         return Form::make(new FarmHouseConfigRepository(), function (Form $form) {
+            $helper = new FormHelper($form, $this);
+
             $form->display('id', 'ID');
             $form->number('level', '等级')->min(1)->max(12)->required();
             $form->rate('output_bonus', '产出加成')->max(1)->step(0.05)->required();
             $form->number('special_land_limit', '特殊土地上限')->min(0)->default(0)->required();
-            $form->textarea('upgrade_materials', '升级所需材料')->json()->required();
+            $helper->tableMaterials('upgrade_materials', '升级所需材料');
             $form->number('downgrade_days', '降级天数')->min(1)->help('留空表示不降级');
 
             $form->display('created_at', '创建时间');

+ 56 - 41
app/Module/Farm/AdminControllers/FarmSeedOutputController.php

@@ -2,7 +2,11 @@
 
 namespace App\Module\Farm\AdminControllers;
 
+use App\Module\Farm\AdminControllers\Helper\FilterHelper;
+use App\Module\Farm\AdminControllers\Helper\FormHelper;
 use App\Module\Farm\AdminControllers\Helper\GridHelper;
+use App\Module\Farm\AdminControllers\Helper\ShowHelper;
+use App\Module\Farm\Models\FarmSeedOutput;
 use App\Module\Farm\Repositories\FarmSeedOutputRepository;
 use App\Module\Farm\Repositories\FarmSeedRepository;
 use Dcat\Admin\Form;
@@ -17,6 +21,7 @@ use Spatie\RouteAttributes\Attributes\Resource;
 #[Resource('farm-seed-outputs', names: 'dcat.admin.farm-seed-outputs')]
 class FarmSeedOutputController extends AdminController
 {
+
     /**
      * 页面标题
      *
@@ -38,30 +43,37 @@ class FarmSeedOutputController extends AdminController
      */
     protected function grid()
     {
-        return Grid::make(new FarmSeedOutputRepository(), function (Grid $grid) {
+        return Grid::make(new FarmSeedOutputRepository([ 'seed', 'item' ]), function (Grid $grid) {
             $helper = new GridHelper($grid, $this);
 
-            $grid->column('id', 'ID')->sortable();
-            $grid->column('seed_id', '种子ID')->sortable();
-            $grid->column('item_id', '产出物品ID')->sortable();
+            $helper->columnId();
+            $grid->column('seed_id', '种子');
+            $grid->column('seed.name', '种子');
+            $grid->column('item_id', '产出物品');
+            $grid->column('item.name', '产出物品');
+
             $grid->column('min_amount', '最小产出数量')->sortable();
             $grid->column('max_amount', '最大产出数量')->sortable();
             $grid->column('probability', '产出概率')->display(function ($value) {
-                return ($value * 100) . '%';
+                return $value . '%';
             })->sortable();
-            $grid->column('is_default', '默认产出')->bool()->sortable();
-            $grid->column('created_at', '创建时间')->sortable();
-            $grid->column('updated_at', '更新时间')->sortable();
+            $grid->column('is_default', '默认产出')->switch();
+            $helper->columnCreatedAt();
+            $helper->columnUpdatedAt();
 
             $grid->filter(function (Grid\Filter $filter) {
-                $filter->equal('id', 'ID');
-                $filter->equal('seed_id', '种子ID');
-                $filter->equal('item_id', '产出物品ID');
-                $filter->equal('is_default', '默认产出')->radio([
-                    1 => '是',
-                    0 => '否',
-                ]);
-                $filter->between('created_at', '创建时间')->datetime();
+                $filterHelper = new FilterHelper($filter, $this);
+
+                $filterHelper->equalId();
+                $filterHelper->equalSelectSeed('seed_id', '种子');
+                $filterHelper->equalSelectItem('item_id', '产出物品');
+                $filterHelper->equal('is_default', '默认产出');
+                $filterHelper->betweenDatetime('created_at', '创建时间');
+            });
+            $grid->actions(function (Grid\Displayers\Actions $actions) {
+                $actions->disableDelete();
+                // 添加复制功能
+                $actions->append(new \App\Module\Farm\AdminControllers\Actions\CopyAction());
             });
         });
     }
@@ -75,17 +87,17 @@ class FarmSeedOutputController extends AdminController
     protected function detail($id)
     {
         return Show::make($id, new FarmSeedOutputRepository(), function (Show $show) {
+            $helper = new ShowHelper($show, $this);
+
             $show->field('id', 'ID');
-            $show->field('seed_id', '种子ID');
-            $show->field('item_id', '产出物品ID');
+            $helper->fieldSeed('seed_id', '种子');
+            $helper->fieldItem('item_id', '产出物品');
             $show->field('min_amount', '最小产出数量');
             $show->field('max_amount', '最大产出数量');
             $show->field('probability', '产出概率')->as(function ($value) {
-                return ($value * 100) . '%';
-            });
-            $show->field('is_default', '默认产出')->as(function ($value) {
-                return $value ? '是' : '否';
+                return $value . '%';
             });
+            $helper->fieldIsDefault('is_default', '默认产出');
             $show->field('created_at', '创建时间');
             $show->field('updated_at', '更新时间');
         });
@@ -99,50 +111,53 @@ class FarmSeedOutputController extends AdminController
     protected function form()
     {
         return Form::make(new FarmSeedOutputRepository(), function (Form $form) {
-            $form->display('id', 'ID');
+            $helper = new FormHelper($form, $this);
 
-            // 获取所有种子选项
-            $seedRepository = new FarmSeedRepository();
-            $seedOptions = $seedRepository->all()->pluck('name', 'id')->toArray();
+            $form->display('id', 'ID');
 
-            $form->select('seed_id', '种子ID')->options($seedOptions)->required();
-            $form->number('item_id', '产出物品ID')->min(1)->required();
+            $helper->selectSeed('seed_id', '种子');
+            $helper->selectModelItem('item_id', '产出物品');
             $form->number('min_amount', '最小产出数量')->min(0)->required();
             $form->number('max_amount', '最大产出数量')->min(0)->required();
-            $form->rate('probability', '产出概率')->max(1)->step(0.01)->required();
-            $form->switch('is_default', '默认产出')->default(false);
+            $form->number('probability', '产出概率')->min(0)->max(100)
+                ->help('请输入 0-100 之间的数字,表示百分比,如 10 表示 10%')
+                ->required();
+            $helper->switch('is_default', '默认产出');
 
             $form->display('created_at', '创建时间');
             $form->display('updated_at', '更新时间');
 
-            // 验证概率总和不超过1
+            // 验证概率总和不超过100%(概率值为 0-100,如 10 表示 10%)
             $form->saving(function (Form $form) {
                 if ($form->isCreating()) {
-                    $seedId = $form->seed_id;
+                    $seedId      = $form->seed_id;
                     $probability = $form->probability;
 
-                    $repository = new FarmSeedOutputRepository();
-                    $totalProbability = $repository->findBySeedId($seedId)->sum('probability');
 
-                    if ($totalProbability + $probability > 1) {
+                    $totalProbability = (new FarmSeedOutput())->where('seed_id', $seedId)->sum('probability');
+
+                    if ($totalProbability + $probability > 100) {
                         return $form->error('该种子的产出概率总和已超过100%');
                     }
                 }
 
                 if ($form->isEditing()) {
-                    $id = $form->getKey();
-                    $seedId = $form->seed_id;
+                    $id          = $form->getKey();
+                    $seedId      = $form->seed_id;
                     $probability = $form->probability;
 
-                    $repository = new FarmSeedOutputRepository();
-                    $currentItem = $repository->find($id);
-                    $totalProbability = $repository->findBySeedId($seedId)->sum('probability') - $currentItem->probability;
 
-                    if ($totalProbability + $probability > 1) {
+                    $currentItem      = (new FarmSeedOutput())->find($id);
+                    $totalProbability = (new FarmSeedOutput())
+                                            ->where('seed_id', $seedId)
+                                            ->sum('probability') - $currentItem->probability;
+
+                    if ($totalProbability + $probability > 100) {
                         return $form->error('该种子的产出概率总和已超过100%');
                     }
                 }
             });
         });
     }
+
 }

+ 18 - 19
app/Module/Farm/AdminControllers/FarmUpgradeLogController.php

@@ -2,7 +2,9 @@
 
 namespace App\Module\Farm\AdminControllers;
 
+use App\Module\Farm\AdminControllers\Helper\FilterHelper;
 use App\Module\Farm\AdminControllers\Helper\GridHelper;
+use App\Module\Farm\AdminControllers\Helper\ShowHelper;
 use App\Module\Farm\Enums\UPGRADE_TYPE;
 use App\Module\Farm\Repositories\FarmUpgradeLogRepository;
 use Dcat\Admin\Grid;
@@ -40,27 +42,24 @@ class FarmUpgradeLogController extends AdminController
         return Grid::make(new FarmUpgradeLogRepository(), function (Grid $grid) {
             $helper = new GridHelper($grid, $this);
 
-            $grid->column('id', 'ID')->sortable();
-            $grid->column('user_id', '用户ID')->sortable();
-            $grid->column('upgrade_type', '升级类型')->display(function ($value) {
-                return UPGRADE_TYPE::getName($value);
-            })->sortable();
+            $helper->columnId();
+            $helper->columnUserId();
+            $helper->columnUpgradeType();
             $grid->column('target_id', '目标ID')->sortable();
             $grid->column('old_level', '旧等级/类型')->sortable();
             $grid->column('new_level', '新等级/类型')->sortable();
             $grid->column('upgrade_time', '升级时间')->sortable();
-            $grid->column('created_at', '创建时间')->sortable();
+            $helper->columnCreatedAt();
 
             $grid->filter(function (Grid\Filter $filter) {
-                $filter->equal('id', 'ID');
-                $filter->equal('user_id', '用户ID');
-                $filter->equal('upgrade_type', '升级类型')->select([
-                    UPGRADE_TYPE::LAND => UPGRADE_TYPE::getName(UPGRADE_TYPE::LAND),
-                    UPGRADE_TYPE::HOUSE => UPGRADE_TYPE::getName(UPGRADE_TYPE::HOUSE),
-                ]);
+                $filterHelper = new FilterHelper($filter, $this);
+
+                $filterHelper->equalId();
+                $filterHelper->equalUserId();
+                $filterHelper->equalUpgradeType();
                 $filter->equal('target_id', '目标ID');
-                $filter->between('upgrade_time', '升级时间')->datetime();
-                $filter->between('created_at', '创建时间')->datetime();
+                $filterHelper->betweenDatetime('upgrade_time', '升级时间');
+                $filterHelper->betweenDatetime('created_at', '创建时间');
             });
 
             $grid->disableCreateButton();
@@ -82,15 +81,15 @@ class FarmUpgradeLogController extends AdminController
     protected function detail($id)
     {
         return Show::make($id, new FarmUpgradeLogRepository(), function (Show $show) {
+            $helper = new ShowHelper($show, $this);
+
             $show->field('id', 'ID');
-            $show->field('user_id', '用户ID');
-            $show->field('upgrade_type', '升级类型')->as(function ($value) {
-                return UPGRADE_TYPE::getName($value);
-            });
+            $helper->fieldUserId('user_id', '用户ID');
+            $helper->fieldUpgradeType('upgrade_type', '升级类型');
             $show->field('target_id', '目标ID');
             $show->field('old_level', '旧等级/类型');
             $show->field('new_level', '新等级/类型');
-            $show->field('materials_consumed', '消耗的材料')->json();
+            $helper->fieldModelCatsJson('materials_consumed', '消耗的材料');
             $show->field('upgrade_time', '升级时间');
             $show->field('created_at', '创建时间');
         });

+ 0 - 112
app/Module/Farm/AdminControllers/FarmUserReferralController.php

@@ -1,112 +0,0 @@
-<?php
-
-namespace App\Module\Farm\AdminControllers;
-
-use App\Module\Farm\AdminControllers\Helper\GridHelper;
-use App\Module\Farm\Repositories\FarmUserReferralRepository;
-use Dcat\Admin\Form;
-use Dcat\Admin\Grid;
-use Dcat\Admin\Show;
-use UCore\DcatAdmin\AdminController;
-use Spatie\RouteAttributes\Attributes\Resource;
-
-/**
- * 用户推荐关系管理控制器
- */
-#[Resource('farm-user-referrals', names: 'dcat.admin.farm-user-referrals')]
-class FarmUserReferralController extends AdminController
-{
-    /**
-     * 页面标题
-     *
-     * @var string
-     */
-    protected $title = '用户推荐关系管理';
-
-    /**
-     * 页面描述
-     *
-     * @var string
-     */
-    protected $description = '管理用户之间的推荐关系';
-
-    /**
-     * 构建表格
-     *
-     * @return Grid
-     */
-    protected function grid()
-    {
-        return Grid::make(new FarmUserReferralRepository(), function (Grid $grid) {
-            $helper = new GridHelper($grid, $this);
-
-            $grid->column('id', 'ID')->sortable();
-            $grid->column('user_id', '用户ID')->sortable();
-            $grid->column('referrer_id', '推荐人ID')->sortable();
-            $grid->column('level', '推荐层级')->display(function ($value) {
-                return $value == 1 ? '直推' : '间推';
-            })->sortable();
-            $grid->column('created_at', '创建时间')->sortable();
-            $grid->column('updated_at', '更新时间')->sortable();
-
-            $grid->filter(function (Grid\Filter $filter) {
-                $filter->equal('id', 'ID');
-                $filter->equal('user_id', '用户ID');
-                $filter->equal('referrer_id', '推荐人ID');
-                $filter->equal('level', '推荐层级')->select([
-                    1 => '直推',
-                    2 => '间推',
-                ]);
-                $filter->between('created_at', '创建时间')->datetime();
-            });
-        });
-    }
-
-    /**
-     * 构建详情页
-     *
-     * @param mixed $id
-     * @return Show
-     */
-    protected function detail($id)
-    {
-        return Show::make($id, new FarmUserReferralRepository(), function (Show $show) {
-            $show->field('id', 'ID');
-            $show->field('user_id', '用户ID');
-            $show->field('referrer_id', '推荐人ID');
-            $show->field('level', '推荐层级')->as(function ($value) {
-                return $value == 1 ? '直推' : '间推';
-            });
-            $show->field('created_at', '创建时间');
-            $show->field('updated_at', '更新时间');
-        });
-    }
-
-    /**
-     * 构建表单
-     *
-     * @return Form
-     */
-    protected function form()
-    {
-        return Form::make(new FarmUserReferralRepository(), function (Form $form) {
-            $form->display('id', 'ID');
-            $form->text('user_id', '用户ID')->required()->rules('required|integer');
-            $form->text('referrer_id', '推荐人ID')->required()->rules('required|integer');
-            $form->select('level', '推荐层级')->options([
-                1 => '直推',
-                2 => '间推',
-            ])->required();
-
-            $form->display('created_at', '创建时间');
-            $form->display('updated_at', '更新时间');
-
-            // 验证用户ID和推荐人ID不能相同
-            $form->saving(function (Form $form) {
-                if ($form->user_id == $form->referrer_id) {
-                    return $form->error('用户ID和推荐人ID不能相同');
-                }
-            });
-        });
-    }
-}

+ 40 - 1
app/Module/Farm/AdminControllers/Helper/FilterHelperTrait.php

@@ -147,7 +147,7 @@ trait FilterHelperTrait
     }
 
     /**
-     * 添加种子筛选
+     * 添加种子筛选(下拉列表)
      *
      * @param string $field 字段名
      * @param string $label 标签名
@@ -159,6 +159,45 @@ trait FilterHelperTrait
         return $this->filter->equal($field, $label)->select($options);
     }
 
+    /**
+     * 添加种子筛选(表格选择器)
+     *
+     * @param string $field 字段名
+     * @param string $label 标签名
+     * @param int|null $type 种子类型,可选
+     * @return Filter\AbstractFilter
+     */
+    public function equalSelectSeed(string $field = 'seed_id', string $label = '种子', ?int $type = null)
+    {
+        $table = \App\Module\Farm\AdminControllers\LazyRenderable\FarmSeedLazyRenderable::make([
+            'type' => $type
+        ]);
+
+        return $this->filter->equal($field, $label)
+            ->selectTable($table)
+            ->title($label)
+            ->dialogWidth('70%')
+            ->model($table->getModel(), $table->getModelSelectId(), $table->getModelViewName());
+    }
+
+    /**
+     * 添加物品筛选(表格选择器)
+     *
+     * @param string $field 字段名
+     * @param string $label 标签名
+     * @return Filter\AbstractFilter
+     */
+    public function equalSelectItem(string $field = 'item_id', string $label = '物品')
+    {
+        $table = \App\Module\GameItems\AdminControllers\LazyRenderable\ItemLazyRenderable::make();
+
+        return $this->filter->equal($field, $label)
+            ->selectTable($table)
+            ->title($label)
+            ->dialogWidth('70%')
+            ->model($table->getModel(), $table->getModelSelectId(), $table->getModelViewName());
+    }
+
     /**
      * 添加是否施肥筛选
      *

+ 1 - 0
app/Module/Farm/AdminControllers/Helper/FormHelper.php

@@ -12,4 +12,5 @@ use UCore\DcatAdmin\FormHelper as BaseFormHelper;
 class FormHelper extends BaseFormHelper
 {
     use FormHelperTrait;
+    use \App\Module\GameItems\AdminControllers\Helper\FormHelperTrait;
 }

+ 27 - 17
app/Module/Farm/AdminControllers/Helper/FormHelperTrait.php

@@ -11,6 +11,7 @@ use App\Module\Farm\Enums\SEED_TYPE;
 use App\Module\Farm\Enums\UPGRADE_TYPE;
 use App\Module\Farm\Models\FarmLandType;
 use App\Module\Farm\Models\FarmSeed;
+use App\Module\GameItems\AdminControllers\LazyRenderable\ItemLazyRenderable;
 use Dcat\Admin\Form;
 use Dcat\Admin\Form\Field;
 
@@ -38,21 +39,7 @@ trait FormHelperTrait
         ])->required();
     }
 
-    /**
-     * 添加灾害类型选择
-     *
-     * @param string $field 字段名
-     * @param string $label 标签名
-     * @return Field\Select
-     */
-    public function selectDisasterType(string $field = 'disaster_type', string $label = '灾害类型'): Field\Select
-    {
-        return $this->form->select($field, $label)->options([
-            DISASTER_TYPE::DROUGHT->value => DISASTER_TYPE::getName(DISASTER_TYPE::DROUGHT->value),
-            DISASTER_TYPE::PEST->value => DISASTER_TYPE::getName(DISASTER_TYPE::PEST->value),
-            DISASTER_TYPE::WEED->value => DISASTER_TYPE::getName(DISASTER_TYPE::WEED->value),
-        ])->required();
-    }
+
 
     /**
      * 添加生长阶段选择
@@ -135,18 +122,41 @@ trait FormHelperTrait
     }
 
     /**
-     * 添加种子选择
+     * 添加种子选择(下拉列表)
      *
      * @param string $field 字段名
      * @param string $label 标签名
      * @return Field\Select
      */
-    public function selectSeed(string $field = 'seed_id', string $label = '种子'): Field\Select
+    public function selectSeedDropdown(string $field = 'seed_id', string $label = '种子'): Field\Select
     {
         $options = FarmSeed::pluck('name', 'id')->toArray();
         return $this->form->select($field, $label)->options($options)->required();
     }
 
+    /**
+     * 添加种子选择(表格选择器)
+     *
+     * @param string $field 字段名
+     * @param string $label 标签名
+     * @param int|null $type 种子类型,可选
+     * @return Field\SelectTable
+     */
+    public function selectSeed(string $field = 'seed_id', string $label = '种子', ?int $type = null)
+    {
+        $table = \App\Module\Farm\AdminControllers\LazyRenderable\FarmSeedLazyRenderable::make([
+            'type' => $type
+        ]);
+
+        return $this->form->selectTable($field, $label)->from($table)
+            ->title($label)
+            ->dialogWidth('70%')
+            ->model($table->getModel(), $table->getModelSelectId(), $table->getModelViewName());
+    }
+
+
+
+
     /**
      * 添加是否施肥开关
      *

+ 84 - 0
app/Module/Farm/AdminControllers/Helper/GridHelperTrait.php

@@ -223,4 +223,88 @@ trait GridHelperTrait
     {
         return $this->grid->column($field, $label)->bool();
     }
+
+    /**
+     * 添加种子列
+     *
+     * @param string $field 字段名
+     * @param string $label 标签名
+     * @param bool $showType 是否显示种子类型
+     * @return Column
+     */
+    public function columnSeed(string $field = 'seed_id', string $label = '种子', bool $showType = true): Column
+    {
+        return $this->grid->column($field, $label)->display(function ($value) use ($showType) {
+            if (empty($value)) {
+                return '-';
+            }
+
+            // 尝试获取种子名称
+            $seed = \App\Module\Farm\Models\FarmSeed::find($value);
+            if ($seed) {
+                $html = "<span class='badge badge-primary'>{$seed->name}</span>";
+
+                if ($showType) {
+                    $typeName = \App\Module\Farm\Enums\SEED_TYPE::getName($seed->type);
+                    $html .= " <span class='badge badge-info'>{$typeName}</span>";
+                }
+
+                // 如果有关联的物品ID,尝试获取物品名称
+                if ($seed->item_id) {
+                    try {
+                        $item = \App\Module\GameItems\Models\Item::find($seed->item_id);
+                        if ($item) {
+                            $html .= "<br><small>物品: {$item->name} (ID: {$item->id})</small>";
+                        }
+                    } catch (\Exception $e) {
+                        // 忽略异常,只是不显示物品信息
+                    }
+                }
+
+                return $html;
+            }
+
+            return $value;
+        });
+    }
+
+    /**
+     * 添加物品列
+     *
+     * @param string $field 字段名
+     * @param string $label 标签名
+     * @param bool $showType 是否显示物品类型
+     * @return Column
+     */
+    public function columnItem(string $field = 'item_id', string $label = '物品', bool $showType = true): Column
+    {
+        return $this->grid->column($field, $label)->display(function ($value) use ($showType) {
+            if (empty($value)) {
+                return '-';
+            }
+
+            // 尝试获取物品名称
+            try {
+                $item = \App\Module\GameItems\Models\Item::find($value);
+                if ($item) {
+                    $html = "<span class='badge badge-success'>{$item->name}</span>";
+
+                    if ($showType && isset($item->type)) {
+                        try {
+                            $typeName = \App\Module\GameItems\Enums\ITEM_TYPE::getName($item->type);
+                            $html .= " <span class='badge badge-info'>{$typeName}</span>";
+                        } catch (\Exception $e) {
+                            // 忽略异常,只是不显示类型信息
+                        }
+                    }
+
+                    return $html;
+                }
+            } catch (\Exception $e) {
+                // 忽略异常,只是不显示物品信息
+            }
+
+            return $value;
+        });
+    }
 }

+ 111 - 0
app/Module/Farm/AdminControllers/Helper/ShowHelperTrait.php

@@ -183,4 +183,115 @@ trait ShowHelperTrait
             return $value ? '是' : '否';
         });
     }
+
+    /**
+     * 显示种子信息
+     *
+     * @param string $field 字段名
+     * @param string $label 标签名
+     * @return Show\Field
+     */
+    public function fieldSeed(string $field = 'seed_id', string $label = '种子'): Show\Field
+    {
+        return $this->show->field($field, $label)->as(function ($value) {
+            if (empty($value)) {
+                return '-';
+            }
+
+            // 尝试获取种子名称
+            $seed = \App\Module\Farm\Models\FarmSeed::find($value);
+            if ($seed) {
+                $html = "<div class='mb-2'>";
+                $html .= "<span class='badge badge-primary'>{$seed->name}</span> ";
+                $html .= "<span class='badge badge-secondary'>ID: {$seed->id}</span> ";
+
+                $typeName = \App\Module\Farm\Enums\SEED_TYPE::getName($seed->type);
+                $html .= "<span class='badge badge-info'>{$typeName}</span>";
+
+                // 显示种子属性
+                $html .= "<div class='mt-2'>";
+                $html .= "<small>种子期: {$seed->seed_time}秒 | ";
+                $html .= "发芽期: {$seed->sprout_time}秒 | ";
+                $html .= "生长期: {$seed->growth_time}秒</small>";
+                $html .= "</div>";
+
+                // 如果有关联的物品ID,尝试获取物品名称
+                if ($seed->item_id) {
+                    try {
+                        $item = \App\Module\GameItems\Models\Item::find($seed->item_id);
+                        if ($item) {
+                            $html .= "<div class='mt-2'>";
+                            $html .= "<small>产出物品: <span class='badge badge-success'>{$item->name}</span> ";
+                            $html .= "<span class='badge badge-secondary'>ID: {$item->id}</span></small>";
+                            $html .= "</div>";
+                        }
+                    } catch (\Exception $e) {
+                        // 忽略异常,只是不显示物品信息
+                    }
+                }
+
+                $html .= "</div>";
+                return $html;
+            }
+
+            return $value;
+        });
+    }
+
+    /**
+     * 显示物品信息
+     *
+     * @param string $field 字段名
+     * @param string $label 标签名
+     * @return Show\Field
+     */
+    public function fieldItem(string $field = 'item_id', string $label = '物品'): Show\Field
+    {
+        return $this->show->field($field, $label)->as(function ($value) {
+            if (empty($value)) {
+                return '-';
+            }
+
+            // 尝试获取物品名称
+            try {
+                $item = \App\Module\GameItems\Models\Item::find($value);
+                if ($item) {
+                    $html = "<div class='mb-2'>";
+                    $html .= "<span class='badge badge-success'>{$item->name}</span> ";
+                    $html .= "<span class='badge badge-secondary'>ID: {$item->id}</span> ";
+
+                    // 尝试显示物品类型
+                    if (isset($item->type)) {
+                        try {
+                            $typeName = \App\Module\GameItems\Enums\ITEM_TYPE::getName($item->type);
+                            $html .= "<span class='badge badge-info'>{$typeName}</span>";
+                        } catch (\Exception $e) {
+                            // 忽略异常,只是不显示类型信息
+                        }
+                    }
+
+                    // 显示物品属性
+                    if (isset($item->numeric_attributes)) {
+                        $html .= "<div class='mt-2'><small>";
+                        $attrs = json_decode($item->numeric_attributes, true);
+                        if (is_array($attrs)) {
+                            $attrStrings = [];
+                            foreach ($attrs as $key => $value) {
+                                $attrStrings[] = "{$key}: {$value}";
+                            }
+                            $html .= implode(' | ', $attrStrings);
+                        }
+                        $html .= "</small></div>";
+                    }
+
+                    $html .= "</div>";
+                    return $html;
+                }
+            } catch (\Exception $e) {
+                // 忽略异常,只是不显示物品信息
+            }
+
+            return $value;
+        });
+    }
 }

+ 109 - 0
app/Module/Farm/AdminControllers/LazyRenderable/FarmSeedLazyRenderable.php

@@ -0,0 +1,109 @@
+<?php
+
+namespace App\Module\Farm\AdminControllers\LazyRenderable;
+
+use App\Module\Farm\Enums\SEED_TYPE;
+use App\Module\Farm\Models\FarmSeed;
+use App\Module\Farm\Repositories\FarmSeedRepository;
+use Dcat\Admin\Grid;
+use UCore\DcatAdmin\Grid\SelectTable;
+
+/**
+ * 种子选择表格渲染类
+ */
+class FarmSeedLazyRenderable extends \UCore\DcatAdmin\Grid\LazyRenderable implements SelectTable
+{
+    /**
+     * 仓库类
+     *
+     * @var string
+     */
+    static $repository = FarmSeedRepository::class;
+
+    /**
+     * 渲染表格
+     *
+     * @return Grid
+     */
+    public function grid(): Grid
+    {
+        // 获取外部传递的参数
+        $type = $this->type;
+
+        return Grid::make(new self::$repository, function (Grid $grid) use ($type) {
+            if ($type) {
+                $grid->model()->where('type', $type);
+            }
+
+            $grid->column('id', 'ID')->sortable();
+            $grid->column('name', '种子名称');
+            $grid->column('type', '种子类型')->display(function ($value) {
+                return "<span class='badge badge-info'>" . SEED_TYPE::getName($value) . "</span>";
+            });
+            $grid->column('item_id', '产出物品')->display(function ($value) {
+                if (empty($value)) {
+                    return '-';
+                }
+
+                try {
+                    $item = \App\Module\GameItems\Models\Item::find($value);
+                    if ($item) {
+                        return "<span class='badge badge-success'>{$item->name}</span> <small>ID: {$item->id}</small>";
+                    }
+                } catch (\Exception $e) {
+                    // 忽略异常
+                }
+
+                return $value;
+            });
+            $grid->column('min_output', '产出范围')->display(function () {
+                return "{$this->min_output} - {$this->max_output}";
+            });
+            $grid->column('created_at', '创建时间')->sortable();
+
+            $grid->quickSearch(['id', 'name']);
+
+            $grid->filter(function (Grid\Filter $filter) {
+                $filter->equal('id', 'ID');
+                $filter->like('name', '种子名称');
+                $filter->equal('type', '种子类型')->select(SEED_TYPE::getAll());
+                $filter->equal('item_id', '产出物品ID');
+                $filter->between('min_output', '最小产出');
+                $filter->between('max_output', '最大产出');
+            });
+
+            $grid->paginate(10);
+            $grid->disableActions();
+        });
+    }
+
+    /**
+     * 获取模型类名
+     *
+     * @return string
+     */
+    public function getModel(): string
+    {
+        return FarmSeed::class;
+    }
+
+    /**
+     * 获取模型选择ID字段
+     *
+     * @return string
+     */
+    public function getModelSelectId(): string
+    {
+        return 'id';
+    }
+
+    /**
+     * 获取模型显示名称字段
+     *
+     * @return string
+     */
+    public function getModelViewName(): string
+    {
+        return 'name';
+    }
+}

+ 1 - 1
app/Module/Farm/Logics/CropLogic.php

@@ -666,7 +666,7 @@ class CropLogic
         $defaultOutput = $outputs->firstWhere('is_default', true);
 
         // 随机选择产出
-        $random = mt_rand(1, 100) / 100;
+        $random = mt_rand(1, 100);
         $cumulativeProbability = 0;
 
         foreach ($outputs as $output) {

+ 8 - 2
app/Module/Farm/Models/FarmSeedOutput.php

@@ -2,6 +2,7 @@
 
 namespace App\Module\Farm\Models;
 
+use App\Module\GameItems\Models\Item;
 use Illuminate\Database\Eloquent\Model;
 use Illuminate\Database\Eloquent\Relations\BelongsTo;
 
@@ -13,8 +14,8 @@ use Illuminate\Database\Eloquent\Relations\BelongsTo;
  * @property int $item_id 产出物品ID
  * @property int $min_amount 最小产出数量
  * @property int $max_amount 最大产出数量
- * @property float $probability 产出概率(0-1)
- * @property bool $is_default 是否为默认产出
+ * @property float $probability 产出概率(0-100,如 10 表示 10%)
+ * @property float $is_default 是否为默认产出
  * @property \Carbon\Carbon $created_at 创建时间
  * @property \Carbon\Carbon $updated_at 更新时间
  */
@@ -60,4 +61,9 @@ class FarmSeedOutput extends Model
     {
         return $this->belongsTo(FarmSeed::class, 'seed_id', 'id');
     }
+    // 物品关联
+    public function item(): BelongsTo
+    {
+        return $this->belongsTo(Item::class, 'item_id', 'id');
+    }
 }

+ 0 - 36
app/Module/Farm/Models/FarmUserReferral.php

@@ -1,36 +0,0 @@
-<?php
-
-namespace App\Module\Farm\Models;
-
-use Illuminate\Database\Eloquent\Model;
-
-/**
- * 用户推荐关系模型
- *
- * @property int $id 主键ID
- * @property int $user_id 用户ID
- * @property int $referrer_id 推荐人ID
- * @property int $level 推荐层级:1直推,2间推
- * @property \Carbon\Carbon $created_at 创建时间
- * @property \Carbon\Carbon $updated_at 更新时间
- */
-class FarmUserReferral extends Model
-{
-    /**
-     * 与模型关联的表名
-     *
-     * @var string
-     */
-    protected $table = 'farm_user_referrals';
-
-    /**
-     * 可批量赋值的属性
-     *
-     * @var array
-     */
-    protected $fillable = [
-        'user_id',
-        'referrer_id',
-        'level',
-    ];
-}

+ 0 - 38
app/Module/Farm/Models/FarmUserTalent.php

@@ -1,38 +0,0 @@
-<?php
-
-namespace App\Module\Farm\Models;
-
-use Illuminate\Database\Eloquent\Model;
-
-/**
- * 达人等级模型
- *
- * @property int $id 主键ID
- * @property int $user_id 用户ID
- * @property int $talent_level 达人等级:0无,1初级,2中级,3高级,4资深,5顶级
- * @property int $direct_count 直推人数
- * @property int $team_count 团队总人数
- * @property \Carbon\Carbon $created_at 创建时间
- * @property \Carbon\Carbon $updated_at 更新时间
- */
-class FarmUserTalent extends Model
-{
-    /**
-     * 与模型关联的表名
-     *
-     * @var string
-     */
-    protected $table = 'farm_user_talents';
-
-    /**
-     * 可批量赋值的属性
-     *
-     * @var array
-     */
-    protected $fillable = [
-        'user_id',
-        'talent_level',
-        'direct_count',
-        'team_count',
-    ];
-}