model()->with(['consumeGroup.consumeItems', 'rewardGroup.rewardItems', 'conditionGroup.conditionItems']);
$helper = new GridHelper($grid, $this);
$helper->columnId();
$grid->column('name', '配方名称');
$grid->column('code', '配方编码');
$grid->column('description', '描述')->limit(50);
// 消耗组列 - 可点击跳转
$grid->column('consumeGroup.name', '消耗组')->display(function ($name) {
if (!$name || !$this->consume_group_id) {
return '无消耗';
}
return $name;
})->link(function () {
if (!$this->consume_group_id) {
return '';
}
return admin_url('game-consume-groups/' . $this->consume_group_id);
});
// 奖励组列 - 可点击跳转
$grid->column('rewardGroup.name', '奖励组')->display(function ($name) {
if (!$name || !$this->reward_group_id) {
return '未配置';
}
return $name;
})->link(function () {
if (!$this->reward_group_id) {
return '';
}
return admin_url('game-reward-groups/' . $this->reward_group_id);
});
// 条件组列 - 可点击跳转
$grid->column('conditionGroup.name', '条件组')->display(function ($name) {
if (!$name || !$this->condition_group_id) {
return '无条件';
}
return $name;
})->link(function () {
if (!$this->condition_group_id) {
return '';
}
return admin_url('game-condition-groups/' . $this->condition_group_id);
});
// 消耗组详情列
$grid->column('consume_group_details', '消耗组详情')->display(function () {
return $this->formatConsumeDetails();
})->width('200px');
// 奖励组详情列
$grid->column('reward_group_details', '奖励组详情')->display(function () {
return $this->formatRewardDetails();
})->width('200px');
// 条件组详情列
$grid->column('condition_group_details', '条件组详情')->display(function () {
return $this->formatConditionDetails();
})->width('200px');
// 展示属性列
$grid->column('display_attributes', '展示属性')->display(function ($value) {
if (empty($value)) {
return '-';
}
if (is_string($value)) {
$value = json_decode($value, true);
}
$html = '
';
foreach ((array)$value as $key => $val) {
if (empty($val)) continue;
$html .= "
{$key}: {$val}
";
}
$html .= '
';
return $html;
})->width('200px');
$grid->column('success_rate', '成功率')->display(function ($value) {
return $value . '%';
});
$grid->column('cooldown_seconds', '冷却时间(秒)');
$grid->column('is_active', '是否激活')->switch();
$grid->column('created_at', '创建时间');
$grid->column('updated_at', '更新时间');
// 筛选
$grid->filter(function ($filter) {
$helper = new FilterHelper($filter, $this);
$helper->equal('id', 'ID');
$filter->like('name', '配方名称');
$filter->like('code', '配方编码');
$filter->equal('consume_group_id', '消耗组')->select(
\App\Module\Game\Models\GameConsumeGroup::pluck('name', 'id')
);
$filter->equal('reward_group_id', '奖励组')->select(
\App\Module\Game\Models\GameRewardGroup::pluck('name', 'id')
);
$filter->equal('condition_group_id', '条件组')->select(
\App\Module\Game\Models\GameConditionGroup::pluck('name', 'id')
);
$filter->equal('is_active', '是否激活')->radio([
1 => '是',
0 => '否',
]);
});
// 行操作
$grid->actions(function (Grid\Displayers\Actions $actions) {
// 添加复制按钮
$actions->append(new DuplicateItemRecipeAction());
});
});
}
/**
* 详情页
*
* @param mixed $id
* @param Content $content
* @return Content
*/
public function show($id, Content $content)
{
return $content
->header($this->title)
->description('详情')
->body($this->detail($id));
}
/**
* 详情页
*
* @param mixed $id
* @return Show
*/
protected function detail($id)
{
return Show::make($id, new ItemRecipeRepository(), function (Show $show) {
$helper = new ShowHelper($show, $this);
$helper->field('id', 'ID');
$helper->field('name', '配方名称');
$helper->field('code', '配方编码');
$helper->field('description', '配方描述');
// 展示属性
$show->field('display_attributes', '展示属性')->as(function ($value) {
if (empty($value)) {
return '无';
}
if (is_string($value)) {
$value = json_decode($value, true);
}
$html = '';
$html .= '| 属性 | 值 |
';
foreach ((array)$value as $key => $val) {
if (empty($val)) continue;
$html .= "| {$key} | {$val} |
";
}
$html .= '
';
return $html;
});
$show->field('success_rate', '成功率')->as(function ($value) {
return $value . '%';
});
$helper->field('cooldown_seconds', '冷却时间(秒)');
$show->field('is_active', '是否激活')->as(function ($value) {
return $value ? '是' : '否';
});
// 显示消耗组
$show->divider('消耗组');
$show->field('consumeGroup.name', '消耗组名称');
$show->field('consumeGroup.description', '消耗组描述');
// 显示奖励组
$show->divider('奖励组');
$show->field('rewardGroup.name', '奖励组名称');
$show->field('rewardGroup.description', '奖励组描述');
// 显示条件组
$show->divider('条件组');
$show->field('conditionGroup.name', '条件组名称');
$show->field('conditionGroup.description', '条件组描述');
$helper->field('created_at', '创建时间');
$helper->field('updated_at', '更新时间');
});
}
/**
* 创建页
*
* @param Content $content
* @return Content
*/
public function create(Content $content)
{
return $content
->header($this->title)
->description('创建')
->body($this->form());
}
/**
* 编辑页
*
* @param mixed $id
* @param Content $content
* @return Content
*/
public function edit($id, Content $content)
{
return $content
->header($this->title)
->description('编辑')
->body($this->form()->edit($id));
}
/**
* 表单
*
* @return Form
*/
protected function form()
{
return Form::make(new ItemRecipeRepository(), function (Form $form) {
$helper = new \App\Module\GameItems\AdminControllers\Helper\FormHelper($form, $this);
$helper->text('name', '配方名称')->required();
$helper->text('code', '配方编码')
->help('唯一的配方编码,用于程序识别');
$form->textarea('description', '配方描述')
->help('配方的详细描述');
// 消耗组选择
$form->select('consume_group_id', '消耗组')
->options(\App\Module\Game\Models\GameConsumeGroup::pluck('name', 'id'))
->help('选择合成时需要消耗的材料组');
// 奖励组选择
$form->select('reward_group_id', '奖励组')
->options(\App\Module\Game\Models\GameRewardGroup::pluck('name', 'id'))
->help('选择合成成功后获得的奖励组')
->required();
// 条件组选择
$form->select('condition_group_id', '条件组')
->options(\App\Module\Game\Models\GameConditionGroup::pluck('name', 'id'))
->help('选择解锁该配方需要满足的条件组(可选)');
// 展示属性
$helper->embedsCats('display_attributes', '展示属性');
$form->rate('success_rate', '成功率')
->default(100)
->help('合成成功的概率,100表示100%成功率');
$form->number('cooldown_seconds', '冷却时间(秒)')
->default(0)
->min(0)
->help('两次合成之间的冷却时间,0表示无冷却');
$form->number('sort_order', '排序权重')
->default(0)
->help('数值越大排序越靠前');
$form->switch('is_active', '是否激活')
->default(true)
->help('是否激活该配方');
});
}
}