| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195 |
- <?php
- 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\Models\FarmSeed;
- use App\Module\Farm\Models\FarmLandType;
- use App\Module\Farm\Repositories\FarmMysterySeeLandEffectRepository;
- use Dcat\Admin\Grid;
- use Dcat\Admin\Show;
- use Dcat\Admin\Form;
- use UCore\DcatAdmin\AdminController;
- use Spatie\RouteAttributes\Attributes\Resource;
- /**
- * 神秘种子土地影响配置管理控制器
- */
- #[Resource('farm-mystery-seed-land-effects', names: 'dcat.admin.farm-mystery-seed-land-effects')]
- class FarmMysterySeeLandEffectController extends AdminController
- {
- /**
- * 页面标题
- *
- * @var string
- */
- protected $title = '神秘种子土地影响配置管理';
- /**
- * 页面描述
- *
- * @var string
- */
- protected $description = '管理神秘种子在不同土地类型上的产出概率影响配置';
- /**
- * 构建表格
- *
- * @return Grid
- */
- protected function grid()
- {
- return Grid::make(new FarmMysterySeeLandEffectRepository(['seed', 'landType']), function (Grid $grid) {
- $helper = new GridHelper($grid, $this);
- $helper->columnId();
- $grid->column('seed.name', '种子名称')->label('primary');
- $grid->column('landType.name', '土地类型')->label('info');
- $grid->column('output_item_id', '产出物品ID')->display(function ($value) {
- return "<span class='badge badge-secondary'>{$value}</span>";
- });
- $grid->column('probability_modifier', '概率修正值')->display(function ($value) {
- $color = $value > 0 ? 'success' : ($value < 0 ? 'danger' : 'secondary');
- $sign = $value > 0 ? '+' : '';
- return "<span class='badge badge-{$color}'>{$sign}{$value}%</span>";
- });
- $grid->column('probability_override', '概率覆盖值')->display(function ($value) {
- if ($value !== null) {
- return "<span class='badge badge-warning'>{$value}% (覆盖)</span>";
- } else {
- return '<span class="badge badge-info">使用修正值</span>';
- }
- });
- $grid->column('is_active', '状态')->bool();
- $helper->columnCreatedAt();
- $grid->filter(function (Grid\Filter $filter) {
- $filterHelper = new FilterHelper($filter, $this);
- $filterHelper->equalId();
- $filter->equal('seed_id', '种子')->select(function () {
- return FarmSeed::pluck('name', 'id')->toArray();
- });
- $filter->equal('land_type_id', '土地类型')->select(function () {
- return FarmLandType::pluck('name', 'id')->toArray();
- });
- $filter->equal('is_active', '状态')->select([
- 1 => '启用',
- 0 => '禁用'
- ]);
- $filterHelper->betweenDatetime('created_at', '创建时间');
- });
- });
- }
- /**
- * 构建详情页
- *
- * @param mixed $id
- * @return Show
- */
- protected function detail($id)
- {
- return Show::make($id, new FarmMysterySeeLandEffectRepository(), function (Show $show) {
- $show->field('id', 'ID');
- $show->field('seed.name', '种子名称');
- $show->field('landType.name', '土地类型');
- $show->field('output_item_id', '产出物品ID');
- $show->field('probability_modifier', '概率修正值')->as(function ($value) {
- $sign = $value > 0 ? '+' : '';
- return "{$sign}{$value}%";
- });
- $show->field('probability_override', '概率覆盖值')->as(function ($value) {
- return $value !== null ? "{$value}% (覆盖模式)" : '未设置 (修正模式)';
- });
- $show->field('is_active', '状态')->using([1 => '启用', 0 => '禁用']);
- $show->field('created_at', '创建时间');
- $show->field('updated_at', '更新时间');
- });
- }
- /**
- * 构建表单
- *
- * @return Form
- */
- protected function form()
- {
- return Form::make(new FarmMysterySeeLandEffectRepository(), function (Form $form) {
- $helper = new FormHelper($form, $this);
- $form->display('id', 'ID');
- $helper->selectSeed('seed_id', '种子');
- $form->select('land_type_id', '土地类型')
- ->options(function () {
- return FarmLandType::pluck('name', 'id')->toArray();
- })
- ->required()
- ->help('选择土地类型');
- $form->number('output_item_id', '产出物品ID')
- ->required()
- ->min(1)
- ->help('产出物品的ID');
- $form->decimal('probability_modifier', '概率修正值')
- ->default(0.0000)
- ->help('百分比值,可为负数。如:5.0000 表示 +5%,-3.0000 表示 -3%');
- $form->decimal('probability_override', '概率覆盖值')
- ->help('百分比值,直接覆盖原概率。如:25.0000 表示覆盖为25%。优先级高于修正值,留空则使用修正值');
- $helper->switch('is_active', '是否启用');
- $form->display('created_at', '创建时间');
- $form->display('updated_at', '更新时间');
- $form->divider();
- $form->html('
- <div class="alert alert-info">
- <h5>配置说明:</h5>
- <ul>
- <li><strong>概率修正值</strong>:在原概率基础上增减,如原概率10%,修正值+5%,最终概率15%</li>
- <li><strong>概率覆盖值</strong>:直接替换原概率,如覆盖值25%,最终概率就是25%</li>
- <li><strong>优先级</strong>:覆盖值 > 修正值,如果设置了覆盖值,修正值将被忽略</li>
- <li><strong>应用场景</strong>:修正值适合微调,覆盖值适合大幅改变</li>
- </ul>
- </div>
- ');
- $form->saving(function (Form $form) {
- // 保存前的数据验证和处理
- if ($form->probability_override !== null && $form->probability_override < 0) {
- return $form->response()->error('概率覆盖值不能为负数');
- }
- if ($form->probability_modifier < -100 || $form->probability_modifier > 100) {
- return $form->response()->error('概率修正值应在-100到100之间');
- }
- });
- $form->saved(function (Form $form) {
- // 保存后清除相关缓存
- $mysteryLogic = new \App\Module\Farm\Logics\MysterySeeLLogic();
- $mysteryLogic->clearCache($form->model()->seed_id, $form->model()->land_type_id);
- });
- });
- }
- }
|