ShowHelperTrait.php 11 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338
  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}秒</small>";
  198. $html .= "</div>";
  199. // 如果有关联的物品ID,尝试获取物品名称
  200. if ($seed->item_id) {
  201. try {
  202. $item = \App\Module\GameItems\Models\Item::find($seed->item_id);
  203. if ($item) {
  204. $html .= "<div class='mt-2'>";
  205. $html .= "<small>产出物品: <span class='badge badge-success'>{$item->name}</span> ";
  206. $html .= "<span class='badge badge-secondary'>ID: {$item->id}</span></small>";
  207. $html .= "</div>";
  208. }
  209. } catch (\Exception $e) {
  210. // 忽略异常,只是不显示物品信息
  211. }
  212. }
  213. $html .= "</div>";
  214. return $html;
  215. }
  216. return $value;
  217. });
  218. }
  219. /**
  220. * 显示物品信息
  221. *
  222. * @param string $field 字段名
  223. * @param string $label 标签名
  224. * @return Show\Field
  225. */
  226. public function fieldItem(string $field = 'item_id', string $label = '物品'): Show\Field
  227. {
  228. return $this->show->field($field, $label)->as(function ($value) {
  229. if (empty($value)) {
  230. return '-';
  231. }
  232. // 尝试获取物品名称
  233. try {
  234. $item = \App\Module\GameItems\Models\Item::find($value);
  235. if ($item) {
  236. $html = "<div class='mb-2'>";
  237. $html .= "<span class='badge badge-success'>{$item->name}</span> ";
  238. $html .= "<span class='badge badge-secondary'>ID: {$item->id}</span> ";
  239. // 尝试显示物品类型
  240. if (isset($item->type)) {
  241. try {
  242. $typeName = \App\Module\GameItems\Enums\ITEM_TYPE::getName($item->type);
  243. $html .= "<span class='badge badge-info'>{$typeName}</span>";
  244. } catch (\Exception $e) {
  245. // 忽略异常,只是不显示类型信息
  246. }
  247. }
  248. // 显示物品属性
  249. if (isset($item->numeric_attributes)) {
  250. $html .= "<div class='mt-2'><small>";
  251. $attrs = json_decode($item->numeric_attributes, true);
  252. if (is_array($attrs)) {
  253. $attrStrings = [];
  254. foreach ($attrs as $key => $value) {
  255. $attrStrings[] = "{$key}: {$value}";
  256. }
  257. $html .= implode(' | ', $attrStrings);
  258. }
  259. $html .= "</small></div>";
  260. }
  261. $html .= "</div>";
  262. return $html;
  263. }
  264. } catch (\Exception $e) {
  265. // 忽略异常,只是不显示物品信息
  266. }
  267. return $value;
  268. });
  269. }
  270. /**
  271. * 显示模型Cast JSON字段
  272. *
  273. * @param string $field 字段名
  274. * @param string $label 标签名
  275. * @return Show\Field
  276. */
  277. public function fieldModelCatsJson2(string $field, string $label): Show\Field
  278. {
  279. return $this->show->field($field, $label)->as(function ($value) {
  280. if (empty($value)) {
  281. return '-';
  282. }
  283. if (is_string($value)) {
  284. $value = json_decode($value, true);
  285. } elseif (is_object($value)) {
  286. $value = (array)$value;
  287. }
  288. if (!is_array($value)) {
  289. return '-';
  290. }
  291. $html = '<div class="table-responsive"><table class="table table-sm table-bordered">';
  292. $html .= '<thead><tr><th>属性</th><th>值</th></tr></thead>';
  293. $html .= '<tbody>';
  294. foreach ($value as $key => $val) {
  295. if (is_array($val) || is_object($val)) {
  296. $val = json_encode($val, JSON_UNESCAPED_UNICODE);
  297. }
  298. $html .= "<tr><td>{$key}</td><td>{$val}</td></tr>";
  299. }
  300. $html .= '</tbody></table></div>';
  301. return $html;
  302. });
  303. }
  304. }