columnId();
$grid->column('seed.name', '种子名称')->label('primary');
$grid->column('landType.name', '土地类型')->label('info');
$grid->column('output_item_id', '产出物品')->display(function ($value) {
$item = $this->outputItem;
if ($item) {
return "
{$item->name}
ID: {$value}
";
} else {
return "物品不存在 (ID: {$value})";
}
});
$grid->column('probability_modifier', '概率修正值')->display(function ($value) {
$color = $value > 0 ? 'success' : ($value < 0 ? 'danger' : 'secondary');
$sign = $value > 0 ? '+' : '';
return "{$sign}{$value}%";
});
$grid->column('probability_override', '概率覆盖值')->display(function ($value) {
if ($value !== null) {
return "{$value}% (覆盖)";
} else {
return '使用修正值';
}
});
$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();
});
// 添加物品筛选
$itemTable = \App\Module\GameItems\AdminControllers\LazyRenderable\ItemLazyRenderable::make();
$filter->equal('output_item_id', '产出物品')
->selectTable($itemTable)
->title('选择物品')
->dialogWidth('70%')
->model($itemTable->getModel(), $itemTable->getModelSelectId(), $itemTable->getModelViewName());
$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(['seed', 'landType', 'outputItem']), function (Show $show) {
$show->field('id', 'ID');
$show->field('seed.name', '种子名称');
$show->field('landType.name', '土地类型');
$show->field('output_item_id', '产出物品')->as(function ($value) {
$item = $this->outputItem;
if ($item) {
return "{$item->name} (ID: {$value})";
} else {
return "物品不存在 (ID: {$value})";
}
});
$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('选择土地类型');
// 使用物品选择器
$itemTable = \App\Module\GameItems\AdminControllers\LazyRenderable\ItemLazyRenderable::make();
$form->selectTable('output_item_id', '产出物品')->from($itemTable)
->title('选择产出物品')
->dialogWidth('70%')
->model($itemTable->getModel(), $itemTable->getModelSelectId(), $itemTable->getModelViewName())
->required()
->help('选择神秘种子在该土地类型上的产出物品');
$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('
配置说明:
- 概率修正值:在原概率基础上增减,如原概率10%,修正值+5%,最终概率15%
- 概率覆盖值:直接替换原概率,如覆盖值25%,最终概率就是25%
- 优先级:覆盖值 > 修正值,如果设置了覆盖值,修正值将被忽略
- 应用场景:修正值适合微调,覆盖值适合大幅改变
');
$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);
});
});
}
}