GridHelperTrait.php 9.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310
  1. <?php
  2. namespace App\Module\Farm\AdminControllers\Helper;
  3. use App\Module\Farm\Enums\BUFF_TYPE;
  4. use App\Module\Farm\Enums\DISASTER_TYPE;
  5. use App\Module\Farm\Enums\GROWTH_STAGE;
  6. use App\Module\Farm\Enums\LAND_STATUS;
  7. use App\Module\Farm\Enums\LAND_TYPE;
  8. use App\Module\Farm\Enums\SEED_TYPE;
  9. use App\Module\Farm\Enums\UPGRADE_TYPE;
  10. use Dcat\Admin\Grid;
  11. use Dcat\Admin\Grid\Column;
  12. /**
  13. * 列表页辅助特性
  14. *
  15. * 提供农场模块后台控制器的列表页构建功能的具体实现
  16. */
  17. trait GridHelperTrait
  18. {
  19. /**
  20. * 添加神灵加持类型列
  21. *
  22. * @param string $field 字段名
  23. * @param string $label 标签名
  24. * @return Column
  25. */
  26. public function columnBuffType(string $field = 'buff_type', string $label = '加持类型'): Column
  27. {
  28. return $this->grid->column($field, $label)->display(function ($value) {
  29. return BUFF_TYPE::getName($value);
  30. });
  31. }
  32. /**
  33. * 添加灾害类型列
  34. *
  35. * @param string $field 字段名
  36. * @param string $label 标签名
  37. * @return Column
  38. */
  39. public function columnDisasterType(string $field = 'disaster_type', string $label = '灾害类型'): Column
  40. {
  41. return $this->grid->column($field, $label)->display(function ($value) {
  42. return DISASTER_TYPE::getName($value);
  43. });
  44. }
  45. /**
  46. * 添加生长阶段列
  47. *
  48. * @param string $field 字段名
  49. * @param string $label 标签名
  50. * @return Column
  51. */
  52. public function columnGrowthStage(string $field = 'growth_stage', string $label = '生长阶段'): Column
  53. {
  54. return $this->grid->column($field, $label)->display(function ($value) {
  55. return GROWTH_STAGE::getName($value);
  56. })->label([
  57. GROWTH_STAGE::SEED->value => 'default',
  58. GROWTH_STAGE::SPROUT->value => 'info',
  59. GROWTH_STAGE::GROWTH->value => 'primary',
  60. GROWTH_STAGE::MATURE->value => 'success',
  61. GROWTH_STAGE::WITHERED->value => 'danger',
  62. ]);
  63. }
  64. /**
  65. * 添加土地状态列
  66. *
  67. * @param string $field 字段名
  68. * @param string $label 标签名
  69. * @return Column
  70. */
  71. public function columnLandStatus(string $field = 'status', string $label = '土地状态'): Column
  72. {
  73. return $this->grid->column($field, $label)->display(function ($value) {
  74. return LAND_STATUS::getName($value);
  75. })->label([
  76. LAND_STATUS::IDLE->value => 'default',
  77. LAND_STATUS::PLANTING->value => 'primary',
  78. LAND_STATUS::DISASTER->value => 'warning',
  79. LAND_STATUS::HARVESTABLE->value => 'success',
  80. LAND_STATUS::WITHERED->value => 'danger',
  81. ]);
  82. }
  83. /**
  84. * 添加土地类型列
  85. *
  86. * @param string $field 字段名
  87. * @param string $label 标签名
  88. * @return Column
  89. */
  90. public function columnLandType(string $field = 'land_type', string $label = '土地类型'): Column
  91. {
  92. return $this->grid->column($field, $label)->display(function ($value) {
  93. return LAND_TYPE::getName($value);
  94. })->label([
  95. LAND_TYPE::NORMAL->value => 'default',
  96. LAND_TYPE::RED->value => 'danger',
  97. LAND_TYPE::BLACK->value => 'dark',
  98. LAND_TYPE::GOLD->value => 'warning',
  99. LAND_TYPE::BLUE->value => 'info',
  100. LAND_TYPE::PURPLE->value => 'primary',
  101. ]);
  102. }
  103. /**
  104. * 添加种子类型列
  105. *
  106. * @param string $field 字段名
  107. * @param string $label 标签名
  108. * @return Column
  109. */
  110. public function columnSeedType(string $field = 'type', string $label = '种子类型'): Column
  111. {
  112. return $this->grid->column($field, $label)->display(function ($value) {
  113. return SEED_TYPE::getName($value);
  114. })->label([
  115. SEED_TYPE::NORMAL->value => 'default',
  116. SEED_TYPE::MYSTERIOUS->value => 'primary',
  117. SEED_TYPE::GIANT->value => 'success',
  118. ]);
  119. }
  120. /**
  121. * 添加升级类型列
  122. *
  123. * @param string $field 字段名
  124. * @param string $label 标签名
  125. * @return Column
  126. */
  127. public function columnUpgradeType(string $field = 'upgrade_type', string $label = '升级类型'): Column
  128. {
  129. return $this->grid->column($field, $label)->display(function ($value) {
  130. return UPGRADE_TYPE::getName($value);
  131. })->label([
  132. UPGRADE_TYPE::LAND->value => 'primary',
  133. UPGRADE_TYPE::HOUSE->value => 'success',
  134. ]);
  135. }
  136. /**
  137. * 添加灾害情况列
  138. *
  139. * @param string $field 字段名
  140. * @param string $label 标签名
  141. * @return Column
  142. */
  143. public function columnDisasters(string $field = 'disasters', string $label = '灾害情况'): Column
  144. {
  145. return $this->grid->column($field, $label)->display(function ($value) {
  146. if (empty($value)) {
  147. return '无灾害';
  148. }
  149. $disasters = json_decode($value, true);
  150. if (empty($disasters)) {
  151. return '无灾害';
  152. }
  153. $result = [];
  154. foreach ($disasters as $type => $time) {
  155. $disasterName = DISASTER_TYPE::getName((int)$type);
  156. $result[] = $disasterName;
  157. }
  158. return implode('<br>', $result);
  159. });
  160. }
  161. /**
  162. * 添加是否施肥列
  163. *
  164. * @param string $field 字段名
  165. * @param string $label 标签名
  166. * @return Column
  167. */
  168. public function columnFertilized(string $field = 'fertilized', string $label = '已施肥'): Column
  169. {
  170. return $this->grid->column($field, $label)->bool();
  171. }
  172. /**
  173. * 添加产量加成列
  174. *
  175. * @param string $field 字段名
  176. * @param string $label 标签名
  177. * @return Column
  178. */
  179. public function columnOutputBonus(string $field = 'output_bonus', string $label = '产量加成'): Column
  180. {
  181. return $this->grid->column($field, $label)->display(function ($value) {
  182. return ($value * 100) . '%';
  183. });
  184. }
  185. /**
  186. * 添加灾害抵抗列
  187. *
  188. * @param string $field 字段名
  189. * @param string $label 标签名
  190. * @return Column
  191. */
  192. public function columnDisasterResistance(string $field = 'disaster_resistance', string $label = '灾害抵抗'): Column
  193. {
  194. return $this->grid->column($field, $label)->display(function ($value) {
  195. return ($value * 100) . '%';
  196. });
  197. }
  198. /**
  199. * 添加是否特殊土地列
  200. *
  201. * @param string $field 字段名
  202. * @param string $label 标签名
  203. * @return Column
  204. */
  205. public function columnIsSpecial(string $field = 'is_special', string $label = '特殊土地'): Column
  206. {
  207. return $this->grid->column($field, $label)->bool();
  208. }
  209. /**
  210. * 添加种子列
  211. *
  212. * @param string $field 字段名
  213. * @param string $label 标签名
  214. * @param bool $showType 是否显示种子类型
  215. * @return Column
  216. */
  217. public function columnSeed(string $field = 'seed_id', string $label = '种子', bool $showType = true): Column
  218. {
  219. return $this->grid->column($field, $label)->display(function ($value) use ($showType) {
  220. if (empty($value)) {
  221. return '-';
  222. }
  223. // 尝试获取种子名称
  224. $seed = \App\Module\Farm\Models\FarmSeed::find($value);
  225. if ($seed) {
  226. $html = "<span class='badge badge-primary'>{$seed->name}</span>";
  227. if ($showType) {
  228. $typeName = \App\Module\Farm\Enums\SEED_TYPE::getName($seed->type);
  229. $html .= " <span class='badge badge-info'>{$typeName}</span>";
  230. }
  231. // 如果有关联的物品ID,尝试获取物品名称
  232. if ($seed->item_id) {
  233. try {
  234. $item = \App\Module\GameItems\Models\Item::find($seed->item_id);
  235. if ($item) {
  236. $html .= "<br><small>物品: {$item->name} (ID: {$item->id})</small>";
  237. }
  238. } catch (\Exception $e) {
  239. // 忽略异常,只是不显示物品信息
  240. }
  241. }
  242. return $html;
  243. }
  244. return $value;
  245. });
  246. }
  247. /**
  248. * 添加物品列
  249. *
  250. * @param string $field 字段名
  251. * @param string $label 标签名
  252. * @param bool $showType 是否显示物品类型
  253. * @return Column
  254. */
  255. public function columnItem(string $field = 'item_id', string $label = '物品', bool $showType = true): Column
  256. {
  257. return $this->grid->column($field, $label)->display(function ($value) use ($showType) {
  258. if (empty($value)) {
  259. return '-';
  260. }
  261. // 尝试获取物品名称
  262. try {
  263. $item = \App\Module\GameItems\Models\Item::find($value);
  264. if ($item) {
  265. $html = "<span class='badge badge-success'>{$item->name}</span>";
  266. if ($showType && isset($item->type)) {
  267. try {
  268. $typeName = \App\Module\GameItems\Enums\ITEM_TYPE::getName($item->type);
  269. $html .= " <span class='badge badge-info'>{$typeName}</span>";
  270. } catch (\Exception $e) {
  271. // 忽略异常,只是不显示类型信息
  272. }
  273. }
  274. return $html;
  275. }
  276. } catch (\Exception $e) {
  277. // 忽略异常,只是不显示物品信息
  278. }
  279. return $value;
  280. });
  281. }
  282. }