ShowHelperTrait.php 11 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339
  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\Show;
  11. /**
  12. * 详情页辅助特性
  13. *
  14. * 提供农场模块后台控制器的详情页构建功能的具体实现
  15. */
  16. trait ShowHelperTrait
  17. {
  18. /**
  19. * 显示神灵加持类型
  20. *
  21. * @param string $field 字段名
  22. * @param string $label 标签名
  23. * @return Show\Field
  24. */
  25. public function fieldBuffType(string $field = 'buff_type', string $label = '加持类型'): Show\Field
  26. {
  27. return $this->show->field($field, $label)->as(function ($value) {
  28. return BUFF_TYPE::getName($value);
  29. });
  30. }
  31. /**
  32. * 显示灾害类型
  33. *
  34. * @param string $field 字段名
  35. * @param string $label 标签名
  36. * @return Show\Field
  37. */
  38. public function fieldDisasterType(string $field = 'disaster_type', string $label = '灾害类型'): Show\Field
  39. {
  40. return $this->show->field($field, $label)->as(function ($value) {
  41. return DISASTER_TYPE::getName($value);
  42. });
  43. }
  44. /**
  45. * 显示生长阶段
  46. *
  47. * @param string $field 字段名
  48. * @param string $label 标签名
  49. * @return Show\Field
  50. */
  51. public function fieldGrowthStage(string $field = 'growth_stage', string $label = '生长阶段'): Show\Field
  52. {
  53. return $this->show->field($field, $label)->as(function ($value) {
  54. return GROWTH_STAGE::getName($value);
  55. });
  56. }
  57. /**
  58. * 显示土地状态
  59. *
  60. * @param string $field 字段名
  61. * @param string $label 标签名
  62. * @return Show\Field
  63. */
  64. public function fieldLandStatus(string $field = 'status', string $label = '土地状态'): Show\Field
  65. {
  66. return $this->show->field($field, $label)->as(function ($value) {
  67. return LAND_STATUS::getName($value);
  68. });
  69. }
  70. /**
  71. * 显示土地类型
  72. *
  73. * @param string $field 字段名
  74. * @param string $label 标签名
  75. * @return Show\Field
  76. */
  77. public function fieldLandType(string $field = 'land_type', string $label = '土地类型'): Show\Field
  78. {
  79. return $this->show->field($field, $label)->as(function ($value) {
  80. return LAND_TYPE::getName($value);
  81. });
  82. }
  83. /**
  84. * 显示种子类型
  85. *
  86. * @param string $field 字段名
  87. * @param string $label 标签名
  88. * @return Show\Field
  89. */
  90. public function fieldSeedType(string $field = 'type', string $label = '种子类型'): Show\Field
  91. {
  92. return $this->show->field($field, $label)->as(function ($value) {
  93. return SEED_TYPE::getName($value);
  94. });
  95. }
  96. /**
  97. * 显示升级类型
  98. *
  99. * @param string $field 字段名
  100. * @param string $label 标签名
  101. * @return Show\Field
  102. */
  103. public function fieldUpgradeType(string $field = 'upgrade_type', string $label = '升级类型'): Show\Field
  104. {
  105. return $this->show->field($field, $label)->as(function ($value) {
  106. return UPGRADE_TYPE::getName($value);
  107. });
  108. }
  109. /**
  110. * 显示灾害情况
  111. *
  112. * @param string $field 字段名
  113. * @param string $label 标签名
  114. * @return Show\Field
  115. */
  116. public function fieldDisasters(string $field = 'disasters', string $label = '灾害情况'): Show\Field
  117. {
  118. return $this->show->field($field, $label)->json();
  119. }
  120. /**
  121. * 显示是否施肥
  122. *
  123. * @param string $field 字段名
  124. * @param string $label 标签名
  125. * @return Show\Field
  126. */
  127. public function fieldFertilized(string $field = 'fertilized', string $label = '已施肥'): Show\Field
  128. {
  129. return $this->show->field($field, $label)->as(function ($value) {
  130. return $value ? '是' : '否';
  131. });
  132. }
  133. /**
  134. * 显示产量加成
  135. *
  136. * @param string $field 字段名
  137. * @param string $label 标签名
  138. * @return Show\Field
  139. */
  140. public function fieldOutputBonus(string $field = 'output_bonus', string $label = '产量加成'): Show\Field
  141. {
  142. return $this->show->field($field, $label)->as(function ($value) {
  143. return ($value * 100) . '%';
  144. });
  145. }
  146. /**
  147. * 显示灾害抵抗
  148. *
  149. * @param string $field 字段名
  150. * @param string $label 标签名
  151. * @return Show\Field
  152. */
  153. public function fieldDisasterResistance(string $field = 'disaster_resistance', string $label = '灾害抵抗'): Show\Field
  154. {
  155. return $this->show->field($field, $label)->as(function ($value) {
  156. return ($value * 100) . '%';
  157. });
  158. }
  159. /**
  160. * 显示是否特殊土地
  161. *
  162. * @param string $field 字段名
  163. * @param string $label 标签名
  164. * @return Show\Field
  165. */
  166. public function fieldIsSpecial(string $field = 'is_special', string $label = '特殊土地'): Show\Field
  167. {
  168. return $this->show->field($field, $label)->as(function ($value) {
  169. return $value ? '是' : '否';
  170. });
  171. }
  172. /**
  173. * 显示种子信息
  174. *
  175. * @param string $field 字段名
  176. * @param string $label 标签名
  177. * @return Show\Field
  178. */
  179. public function fieldSeed(string $field = 'seed_id', string $label = '种子'): Show\Field
  180. {
  181. return $this->show->field($field, $label)->as(function ($value) {
  182. if (empty($value)) {
  183. return '-';
  184. }
  185. // 尝试获取种子名称
  186. $seed = \App\Module\Farm\Models\FarmSeed::find($value);
  187. if ($seed) {
  188. $html = "<div class='mb-2'>";
  189. $html .= "<span class='badge badge-primary'>{$seed->name}</span> ";
  190. $html .= "<span class='badge badge-secondary'>ID: {$seed->id}</span> ";
  191. $typeName = \App\Module\Farm\Enums\SEED_TYPE::getName($seed->type);
  192. $html .= "<span class='badge badge-info'>{$typeName}</span>";
  193. // 显示种子属性
  194. $html .= "<div class='mt-2'>";
  195. $html .= "<small>种子期: {$seed->seed_time}秒 | ";
  196. $html .= "发芽期: {$seed->sprout_time}秒 | ";
  197. $html .= "生长期: {$seed->growth_time}秒 | ";
  198. $html .= "果实期: " . ($seed->fruit_time ?? 0) . "秒</small>";
  199. $html .= "</div>";
  200. // 如果有关联的物品ID,尝试获取物品名称
  201. if ($seed->item_id) {
  202. try {
  203. $item = \App\Module\GameItems\Models\Item::find($seed->item_id);
  204. if ($item) {
  205. $html .= "<div class='mt-2'>";
  206. $html .= "<small>产出物品: <span class='badge badge-success'>{$item->name}</span> ";
  207. $html .= "<span class='badge badge-secondary'>ID: {$item->id}</span></small>";
  208. $html .= "</div>";
  209. }
  210. } catch (\Exception $e) {
  211. // 忽略异常,只是不显示物品信息
  212. }
  213. }
  214. $html .= "</div>";
  215. return $html;
  216. }
  217. return $value;
  218. });
  219. }
  220. /**
  221. * 显示物品信息
  222. *
  223. * @param string $field 字段名
  224. * @param string $label 标签名
  225. * @return Show\Field
  226. */
  227. public function fieldItem(string $field = 'item_id', string $label = '物品'): Show\Field
  228. {
  229. return $this->show->field($field, $label)->as(function ($value) {
  230. if (empty($value)) {
  231. return '-';
  232. }
  233. // 尝试获取物品名称
  234. try {
  235. $item = \App\Module\GameItems\Models\Item::find($value);
  236. if ($item) {
  237. $html = "<div class='mb-2'>";
  238. $html .= "<span class='badge badge-success'>{$item->name}</span> ";
  239. $html .= "<span class='badge badge-secondary'>ID: {$item->id}</span> ";
  240. // 尝试显示物品类型
  241. if (isset($item->type)) {
  242. try {
  243. $typeName = \App\Module\GameItems\Enums\ITEM_TYPE::getName($item->type);
  244. $html .= "<span class='badge badge-info'>{$typeName}</span>";
  245. } catch (\Exception $e) {
  246. // 忽略异常,只是不显示类型信息
  247. }
  248. }
  249. // 显示物品属性
  250. if (isset($item->numeric_attributes)) {
  251. $html .= "<div class='mt-2'><small>";
  252. $attrs = json_decode($item->numeric_attributes, true);
  253. if (is_array($attrs)) {
  254. $attrStrings = [];
  255. foreach ($attrs as $key => $value) {
  256. $attrStrings[] = "{$key}: {$value}";
  257. }
  258. $html .= implode(' | ', $attrStrings);
  259. }
  260. $html .= "</small></div>";
  261. }
  262. $html .= "</div>";
  263. return $html;
  264. }
  265. } catch (\Exception $e) {
  266. // 忽略异常,只是不显示物品信息
  267. }
  268. return $value;
  269. });
  270. }
  271. /**
  272. * 显示模型Cast JSON字段
  273. *
  274. * @param string $field 字段名
  275. * @param string $label 标签名
  276. * @return Show\Field
  277. */
  278. public function fieldModelCatsJson2(string $field, string $label): Show\Field
  279. {
  280. return $this->show->field($field, $label)->as(function ($value) {
  281. if (empty($value)) {
  282. return '-';
  283. }
  284. if (is_string($value)) {
  285. $value = json_decode($value, true);
  286. } elseif (is_object($value)) {
  287. $value = (array)$value;
  288. }
  289. if (!is_array($value)) {
  290. return '-';
  291. }
  292. $html = '<div class="table-responsive"><table class="table table-sm table-bordered">';
  293. $html .= '<thead><tr><th>属性</th><th>值</th></tr></thead>';
  294. $html .= '<tbody>';
  295. foreach ($value as $key => $val) {
  296. if (is_array($val) || is_object($val)) {
  297. $val = json_encode($val, JSON_UNESCAPED_UNICODE);
  298. }
  299. $html .= "<tr><td>{$key}</td><td>{$val}</td></tr>";
  300. }
  301. $html .= '</tbody></table></div>';
  302. return $html;
  303. });
  304. }
  305. }