GridHelperTrait.php 10 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332
  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 columnLandStatus(string $field = 'status', string $label = '土地状态'): Column
  53. {
  54. return $this->grid->column($field, $label)->display(function ($value) {
  55. return LAND_STATUS::getName($value);
  56. })->label([
  57. LAND_STATUS::IDLE->value => 'default',
  58. LAND_STATUS::PLANTING->value => 'primary',
  59. LAND_STATUS::DISASTER->value => 'warning',
  60. LAND_STATUS::HARVESTABLE->value => 'success',
  61. LAND_STATUS::WITHERED->value => 'danger',
  62. ]);
  63. }
  64. /**
  65. * 添加土地类型列
  66. *
  67. * @param string $field 字段名
  68. * @param string $label 标签名
  69. * @return Column
  70. */
  71. public function columnLandType(string $field = 'land_type', string $label = '土地类型'): Column
  72. {
  73. return $this->grid->column($field, $label)->display(function ($value) {
  74. return LAND_TYPE::getName($value);
  75. })->label([
  76. LAND_TYPE::NORMAL->value => 'default',
  77. LAND_TYPE::RED->value => 'danger',
  78. LAND_TYPE::BLACK->value => 'dark',
  79. LAND_TYPE::GOLD->value => 'warning',
  80. LAND_TYPE::BLUE->value => 'info',
  81. LAND_TYPE::PURPLE->value => 'primary',
  82. ]);
  83. }
  84. /**
  85. * 添加种子类型列
  86. *
  87. * @param string $field 字段名
  88. * @param string $label 标签名
  89. * @return Column
  90. */
  91. public function columnSeedType(string $field = 'type', string $label = '种子类型'): Column
  92. {
  93. return $this->grid->column($field, $label)->display(function ($value) {
  94. return SEED_TYPE::getName($value);
  95. })->label([
  96. SEED_TYPE::NORMAL->value => 'default',
  97. SEED_TYPE::MYSTERIOUS->value => 'primary',
  98. SEED_TYPE::GIANT->value => 'success',
  99. ]);
  100. }
  101. /**
  102. * 添加升级类型列
  103. *
  104. * @param string $field 字段名
  105. * @param string $label 标签名
  106. * @return Column
  107. */
  108. public function columnUpgradeType(string $field = 'upgrade_type', string $label = '升级类型'): Column
  109. {
  110. return $this->grid->column($field, $label)->display(function ($value) {
  111. return UPGRADE_TYPE::getName($value);
  112. })->label([
  113. UPGRADE_TYPE::LAND->value => 'primary',
  114. UPGRADE_TYPE::HOUSE->value => 'success',
  115. ]);
  116. }
  117. /**
  118. * 添加灾害情况列
  119. *
  120. * @param string $field 字段名
  121. * @param string $label 标签名
  122. * @return Column
  123. */
  124. public function columnDisasters(string $field = 'disasters', string $label = '灾害情况'): Column
  125. {
  126. return $this->grid->column($field, $label)->display(function ($value) {
  127. if (empty($value)) {
  128. return '无灾害';
  129. }
  130. $disasters = json_decode($value, true);
  131. if (empty($disasters)) {
  132. return '无灾害';
  133. }
  134. $result = [];
  135. foreach ($disasters as $type => $time) {
  136. $disasterName = DISASTER_TYPE::getName((int)$type);
  137. $result[] = $disasterName;
  138. }
  139. return implode('<br>', $result);
  140. });
  141. }
  142. /**
  143. * 添加是否施肥列
  144. *
  145. * @param string $field 字段名
  146. * @param string $label 标签名
  147. * @return Column
  148. */
  149. public function columnFertilized(string $field = 'fertilized', string $label = '已施肥'): Column
  150. {
  151. return $this->grid->column($field, $label)->bool();
  152. }
  153. /**
  154. * 添加产量加成列
  155. *
  156. * @param string $field 字段名
  157. * @param string $label 标签名
  158. * @return Column
  159. */
  160. public function columnOutputBonus(string $field = 'output_bonus', string $label = '产量加成'): Column
  161. {
  162. return $this->grid->column($field, $label)->display(function ($value) {
  163. return ($value * 100) . '%';
  164. });
  165. }
  166. /**
  167. * 添加灾害抵抗列
  168. *
  169. * @param string $field 字段名
  170. * @param string $label 标签名
  171. * @return Column
  172. */
  173. public function columnDisasterResistance(string $field = 'disaster_resistance', string $label = '灾害抵抗'): Column
  174. {
  175. return $this->grid->column($field, $label)->display(function ($value) {
  176. return ($value * 100) . '%';
  177. });
  178. }
  179. /**
  180. * 添加是否特殊土地列
  181. *
  182. * @param string $field 字段名
  183. * @param string $label 标签名
  184. * @return Column
  185. */
  186. public function columnIsSpecial(string $field = 'is_special', string $label = '特殊土地'): Column
  187. {
  188. return $this->grid->column($field, $label)->bool();
  189. }
  190. /**
  191. * 添加种子列
  192. *
  193. * @param string $field 字段名
  194. * @param string $label 标签名
  195. * @param bool $showType 是否显示种子类型
  196. * @return Column
  197. */
  198. public function columnSeed(string $field = 'seed_id', string $label = '种子', bool $showType = true): Column
  199. {
  200. return $this->grid->column($field, $label)->display(function ($value) use ($showType) {
  201. if (empty($value)) {
  202. return '-';
  203. }
  204. // 尝试获取种子名称
  205. $seed = \App\Module\Farm\Models\FarmSeed::find($value);
  206. if ($seed) {
  207. $html = "<span class='badge badge-primary'>{$seed->name}</span>";
  208. if ($showType) {
  209. $typeName = \App\Module\Farm\Enums\SEED_TYPE::getName($seed->type);
  210. $html .= " <span class='badge badge-info'>{$typeName}</span>";
  211. }
  212. // 如果有关联的物品ID,尝试获取物品名称
  213. if ($seed->item_id) {
  214. try {
  215. $item = \App\Module\GameItems\Models\Item::find($seed->item_id);
  216. if ($item) {
  217. $html .= "<br><small>物品: {$item->name} (ID: {$item->id})</small>";
  218. }
  219. } catch (\Exception $e) {
  220. // 忽略异常,只是不显示物品信息
  221. }
  222. }
  223. return $html;
  224. }
  225. return $value;
  226. });
  227. }
  228. /**
  229. * 添加物品列
  230. *
  231. * @param string $field 字段名
  232. * @param string $label 标签名
  233. * @param bool $showType 是否显示物品类型
  234. * @return Column
  235. */
  236. public function columnItem(string $field = 'item_id', string $label = '物品', bool $showType = true): Column
  237. {
  238. return $this->grid->column($field, $label)->display(function ($value) use ($showType) {
  239. if (empty($value)) {
  240. return '-';
  241. }
  242. // 尝试获取物品名称
  243. try {
  244. $item = \App\Module\GameItems\Models\Item::find($value);
  245. if ($item) {
  246. $html = "<span class='badge badge-success'>{$item->name}</span>";
  247. if ($showType && isset($item->type)) {
  248. try {
  249. $typeName = \App\Module\GameItems\Enums\ITEM_TYPE::getName($item->type);
  250. $html .= " <span class='badge badge-info'>{$typeName}</span>";
  251. } catch (\Exception $e) {
  252. // 忽略异常,只是不显示类型信息
  253. }
  254. }
  255. return $html;
  256. }
  257. } catch (\Exception $e) {
  258. // 忽略异常,只是不显示物品信息
  259. }
  260. return $value;
  261. });
  262. }
  263. /**
  264. * 添加模型Cast JSON列
  265. *
  266. * @param string $field 字段名
  267. * @param string $label 标签名
  268. * @return Column
  269. */
  270. public function columnModelCatsJson(string $field, string $label): Column
  271. {
  272. return $this->grid->column($field, $label)->display(function ($value) {
  273. if (empty($value)) {
  274. return '-';
  275. }
  276. if (is_string($value)) {
  277. $value = json_decode($value, true);
  278. } elseif (is_object($value)) {
  279. $value = (array)$value;
  280. }
  281. if (!is_array($value)) {
  282. return '-';
  283. }
  284. $html = '<div class="table-responsive"><table class="table table-sm table-bordered">';
  285. $html .= '<thead><tr><th>属性</th><th>值</th></tr></thead>';
  286. $html .= '<tbody>';
  287. foreach ($value as $key => $val) {
  288. if (is_array($val) || is_object($val)) {
  289. $val = json_encode($val, JSON_UNESCAPED_UNICODE);
  290. }
  291. $html .= "<tr><td>{$key}</td><td>{$val}</td></tr>";
  292. }
  293. $html .= '</tbody></table></div>';
  294. return $html;
  295. });
  296. }
  297. }