FarmMysterySeeLandEffectController.php 8.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222
  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\Models\FarmSeed;
  7. use App\Module\Farm\Models\FarmLandType;
  8. use App\Module\Farm\Repositories\FarmMysterySeeLandEffectRepository;
  9. use Dcat\Admin\Grid;
  10. use Dcat\Admin\Show;
  11. use Dcat\Admin\Form;
  12. use UCore\DcatAdmin\AdminController;
  13. use Spatie\RouteAttributes\Attributes\Resource;
  14. /**
  15. * 神秘种子土地影响配置管理控制器
  16. */
  17. #[Resource('farm-mystery-seed-land-effects', names: 'dcat.admin.farm-mystery-seed-land-effects')]
  18. class FarmMysterySeeLandEffectController extends AdminController
  19. {
  20. /**
  21. * 页面标题
  22. *
  23. * @var string
  24. */
  25. protected $title = '神秘种子土地影响配置管理';
  26. /**
  27. * 页面描述
  28. *
  29. * @var string
  30. */
  31. protected $description = '管理神秘种子在不同土地类型上的产出概率影响配置';
  32. /**
  33. * 构建表格
  34. *
  35. * @return Grid
  36. */
  37. protected function grid()
  38. {
  39. return Grid::make(new FarmMysterySeeLandEffectRepository(['seed', 'landType', 'outputItem']), function (Grid $grid) {
  40. $helper = new GridHelper($grid, $this);
  41. $helper->columnId();
  42. $grid->column('seed.name', '种子名称')->label('primary');
  43. $grid->column('landType.name', '土地类型')->label('info');
  44. $grid->column('output_item_id', '产出物品')->display(function ($value) {
  45. $item = $this->outputItem;
  46. if ($item) {
  47. return "<div>
  48. <span class='badge badge-primary'>{$item->name}</span>
  49. <br><small class='text-muted'>ID: {$value}</small>
  50. </div>";
  51. } else {
  52. return "<span class='badge badge-danger'>物品不存在 (ID: {$value})</span>";
  53. }
  54. });
  55. $grid->column('probability_modifier', '概率修正值')->display(function ($value) {
  56. $color = $value > 0 ? 'success' : ($value < 0 ? 'danger' : 'secondary');
  57. $sign = $value > 0 ? '+' : '';
  58. return "<span class='badge badge-{$color}'>{$sign}{$value}%</span>";
  59. });
  60. $grid->column('probability_override', '概率覆盖值')->display(function ($value) {
  61. if ($value !== null) {
  62. return "<span class='badge badge-warning'>{$value}% (覆盖)</span>";
  63. } else {
  64. return '<span class="badge badge-info">使用修正值</span>';
  65. }
  66. });
  67. $grid->column('is_active', '状态')->bool();
  68. $helper->columnCreatedAt();
  69. $grid->filter(function (Grid\Filter $filter) {
  70. $filterHelper = new FilterHelper($filter, $this);
  71. $filterHelper->equalId();
  72. $filter->equal('seed_id', '种子')->select(function () {
  73. return FarmSeed::pluck('name', 'id')->toArray();
  74. });
  75. $filter->equal('land_type_id', '土地类型')->select(function () {
  76. return FarmLandType::pluck('name', 'id')->toArray();
  77. });
  78. // 添加物品筛选
  79. $itemTable = \App\Module\GameItems\AdminControllers\LazyRenderable\ItemLazyRenderable::make();
  80. $filter->equal('output_item_id', '产出物品')
  81. ->selectTable($itemTable)
  82. ->title('选择物品')
  83. ->dialogWidth('70%')
  84. ->model($itemTable->getModel(), $itemTable->getModelSelectId(), $itemTable->getModelViewName());
  85. $filter->equal('is_active', '状态')->select([
  86. 1 => '启用',
  87. 0 => '禁用'
  88. ]);
  89. $filterHelper->betweenDatetime('created_at', '创建时间');
  90. });
  91. });
  92. }
  93. /**
  94. * 构建详情页
  95. *
  96. * @param mixed $id
  97. * @return Show
  98. */
  99. protected function detail($id)
  100. {
  101. return Show::make($id, new FarmMysterySeeLandEffectRepository(['seed', 'landType', 'outputItem']), function (Show $show) {
  102. $show->field('id', 'ID');
  103. $show->field('seed.name', '种子名称');
  104. $show->field('landType.name', '土地类型');
  105. $show->field('output_item_id', '产出物品')->as(function ($value) {
  106. $item = $this->outputItem;
  107. if ($item) {
  108. return "{$item->name} (ID: {$value})";
  109. } else {
  110. return "物品不存在 (ID: {$value})";
  111. }
  112. });
  113. $show->field('probability_modifier', '概率修正值')->as(function ($value) {
  114. $sign = $value > 0 ? '+' : '';
  115. return "{$sign}{$value}%";
  116. });
  117. $show->field('probability_override', '概率覆盖值')->as(function ($value) {
  118. return $value !== null ? "{$value}% (覆盖模式)" : '未设置 (修正模式)';
  119. });
  120. $show->field('is_active', '状态')->using([1 => '启用', 0 => '禁用']);
  121. $show->field('created_at', '创建时间');
  122. $show->field('updated_at', '更新时间');
  123. });
  124. }
  125. /**
  126. * 构建表单
  127. *
  128. * @return Form
  129. */
  130. protected function form()
  131. {
  132. return Form::make(new FarmMysterySeeLandEffectRepository(), function (Form $form) {
  133. $helper = new FormHelper($form, $this);
  134. $form->display('id', 'ID');
  135. $helper->selectSeed('seed_id', '种子');
  136. $form->select('land_type_id', '土地类型')
  137. ->options(function () {
  138. return FarmLandType::pluck('name', 'id')->toArray();
  139. })
  140. ->required()
  141. ->help('选择土地类型');
  142. // 使用物品选择器
  143. $itemTable = \App\Module\GameItems\AdminControllers\LazyRenderable\ItemLazyRenderable::make();
  144. $form->selectTable('output_item_id', '产出物品')->from($itemTable)
  145. ->title('选择产出物品')
  146. ->dialogWidth('70%')
  147. ->model($itemTable->getModel(), $itemTable->getModelSelectId(), $itemTable->getModelViewName())
  148. ->required()
  149. ->help('选择神秘种子在该土地类型上的产出物品');
  150. $form->decimal('probability_modifier', '概率修正值')
  151. ->default(0.0000)
  152. ->help('百分比值,可为负数。如:5.0000 表示 +5%,-3.0000 表示 -3%');
  153. $form->decimal('probability_override', '概率覆盖值')
  154. ->help('百分比值,直接覆盖原概率。如:25.0000 表示覆盖为25%。优先级高于修正值,留空则使用修正值');
  155. $helper->switch('is_active', '是否启用');
  156. $form->display('created_at', '创建时间');
  157. $form->display('updated_at', '更新时间');
  158. $form->divider();
  159. $form->html('
  160. <div class="alert alert-info">
  161. <h5>配置说明:</h5>
  162. <ul>
  163. <li><strong>概率修正值</strong>:在原概率基础上增减,如原概率10%,修正值+5%,最终概率15%</li>
  164. <li><strong>概率覆盖值</strong>:直接替换原概率,如覆盖值25%,最终概率就是25%</li>
  165. <li><strong>优先级</strong>:覆盖值 > 修正值,如果设置了覆盖值,修正值将被忽略</li>
  166. <li><strong>应用场景</strong>:修正值适合微调,覆盖值适合大幅改变</li>
  167. </ul>
  168. </div>
  169. ');
  170. $form->saving(function (Form $form) {
  171. // 保存前的数据验证和处理
  172. if ($form->probability_override !== null && $form->probability_override < 0) {
  173. return $form->response()->error('概率覆盖值不能为负数');
  174. }
  175. if ($form->probability_modifier < -100 || $form->probability_modifier > 100) {
  176. return $form->response()->error('概率修正值应在-100到100之间');
  177. }
  178. });
  179. $form->saved(function (Form $form) {
  180. // 保存后清除相关缓存
  181. $mysteryLogic = new \App\Module\Farm\Logics\MysterySeeLLogic();
  182. $mysteryLogic->clearCache($form->model()->seed_id, $form->model()->land_type_id);
  183. });
  184. });
  185. }
  186. }