GridHelperTrait.php 9.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294
  1. <?php
  2. namespace App\Module\Point\AdminControllers\Helper;
  3. use App\Module\Point\Enums\LOG_TYPE;
  4. use App\Module\Point\Enums\POINT_TYPE;
  5. use App\Module\Point\Services\AccountService;
  6. use Dcat\Admin\Grid\Column;
  7. /**
  8. * 列表页辅助特性
  9. *
  10. * 提供积分模块后台控制器的列表页构建功能的具体实现
  11. * 只保留具有复用价值的方法
  12. */
  13. trait GridHelperTrait
  14. {
  15. /**
  16. * 添加积分类型列
  17. *
  18. * 复用价值:高 - 统一处理积分类型的显示,使用枚举类型
  19. *
  20. * @param string $field 字段名
  21. * @param string $label 标签名
  22. * @return Column
  23. */
  24. public function columnPointId(string $field = 'point_id', string $label = '积分类型'): Column
  25. {
  26. return $this->grid->column($field, $label)->display(function ($value) {
  27. // 如果是枚举对象,获取其值
  28. if (is_object($value) && method_exists($value, 'value')) {
  29. $value = $value->value;
  30. }
  31. $pointTypes = [
  32. 1 => '经验积分',
  33. 2 => '成就积分',
  34. 3 => '活动积分',
  35. 4 => '签到积分',
  36. 5 => '推荐积分',
  37. ];
  38. $pointLabels = [
  39. 1 => 'primary',
  40. 2 => 'success',
  41. 3 => 'warning',
  42. 4 => 'info',
  43. 5 => 'danger',
  44. ];
  45. $typeName = $pointTypes[$value] ?? "积分{$value}";
  46. $labelClass = $pointLabels[$value] ?? 'default';
  47. return "<span class='label label-{$labelClass}'>{$typeName}</span>";
  48. });
  49. }
  50. /**
  51. * 添加积分余额列
  52. *
  53. * 整数积分显示,带千分位分隔符
  54. *
  55. * @param string $field 字段名
  56. * @param string $label 标签名
  57. * @return Column
  58. */
  59. public function columnBalance(string $field = 'balance', string $label = '积分余额'): Column
  60. {
  61. return $this->grid->column($field, $label)->display(function ($value) {
  62. return number_format($value);
  63. })->sortable();
  64. }
  65. /**
  66. * 添加操作积分数量列
  67. *
  68. * 整数积分显示,包括正负值的颜色区分
  69. *
  70. * @param string $field 字段名
  71. * @param string $label 标签名
  72. * @return Column
  73. */
  74. public function columnAmount(string $field = 'amount', string $label = '操作积分'): Column
  75. {
  76. return $this->grid->column($field, $label)->display(function ($value) {
  77. $formattedValue = number_format(abs($value));
  78. if ($value > 0) {
  79. return "<span class='text-success'>+{$formattedValue}</span>";
  80. } elseif ($value < 0) {
  81. return "<span class='text-danger'>-{$formattedValue}</span>";
  82. } else {
  83. return "<span>{$formattedValue}</span>";
  84. }
  85. })->sortable();
  86. }
  87. /**
  88. * 添加操作类型列
  89. *
  90. * 复用价值:高 - 统一处理操作类型的显示,使用枚举类型
  91. *
  92. * @param string $field 字段名
  93. * @param string $label 标签名
  94. * @return Column
  95. */
  96. public function columnOperateType(string $field = 'operate_type', string $label = '操作类型'): Column
  97. {
  98. return $this->grid->column($field, $label)->display(function ($value) {
  99. // 如果是枚举对象,获取其值
  100. if (is_object($value) && method_exists($value, 'value')) {
  101. $value = $value->value;
  102. }
  103. $operateTypes = LOG_TYPE::getAllTypes();
  104. $operateLabels = [
  105. 0 => 'default',
  106. 1 => 'success',
  107. 2 => 'primary',
  108. 3 => 'info',
  109. 4 => 'warning',
  110. 5 => 'success',
  111. 6 => 'success',
  112. 7 => 'danger',
  113. 8 => 'warning',
  114. 9 => 'info',
  115. 10 => 'info',
  116. 11 => 'primary',
  117. 12 => 'warning',
  118. 13 => 'success',
  119. 14 => 'success',
  120. 15 => 'danger',
  121. ];
  122. $typeName = $operateTypes[$value] ?? "操作{$value}";
  123. $labelClass = $operateLabels[$value] ?? 'default';
  124. return "<span class='label label-{$labelClass}'>{$typeName}</span>";
  125. });
  126. }
  127. /**
  128. * 添加时间戳格式化列
  129. *
  130. * 复用价值:高 - 统一处理时间戳的格式化显示
  131. *
  132. * @param string $field 字段名
  133. * @param string $label 标签名
  134. * @param string $format 日期格式
  135. * @return Column
  136. */
  137. public function columnTimestamp(string $field, string $label, string $format = 'Y-m-d H:i:s'): Column
  138. {
  139. return $this->grid->column($field, $label)->display(function ($value) use ($format) {
  140. return $value ? date($format, $value) : '';
  141. })->sortable();
  142. }
  143. /**
  144. * 添加积分数量格式化
  145. *
  146. * 复用价值:高 - 统一处理积分数量的格式化显示
  147. *
  148. * @param string $field 字段名
  149. * @param string $label 标签名
  150. * @return Column
  151. */
  152. public function columnPoints(string $field, string $label): Column
  153. {
  154. return $this->grid->column($field, $label)->display(function ($value) {
  155. return number_format($value);
  156. })->sortable();
  157. }
  158. /**
  159. * 添加用户积分组合列
  160. *
  161. * 复用价值:高 - 将用户ID和积分类型组合显示,提高信息密度
  162. *
  163. * @param string $userIdField 用户ID字段名
  164. * @param string $pointIdField 积分类型字段名
  165. * @param string $label 标签名
  166. * @return Column
  167. */
  168. public function columnUserPoint(string $userIdField = 'user_id', string $pointIdField = 'point_id', string $label = '用户/积分'): Column
  169. {
  170. return $this->grid->column($userIdField, $label)->display(function ($userId) use ($pointIdField) {
  171. $pointId = $this->{$pointIdField};
  172. $pointTypes = [
  173. 1 => '经验积分',
  174. 2 => '成就积分',
  175. 3 => '活动积分',
  176. 4 => '签到积分',
  177. 5 => '推荐积分',
  178. ];
  179. if (is_object($pointId)) {
  180. $pointId = $pointId->value;
  181. }
  182. $pointName = $pointTypes[$pointId] ?? "积分{$pointId}";
  183. return "ID: {$userId}<br>类型: {$pointName}";
  184. });
  185. }
  186. /**
  187. * 添加积分流转信息组合列
  188. *
  189. * 复用价值:高 - 将积分流转的来源和目标信息组合显示
  190. *
  191. * @param string $label 标签名
  192. * @return Column
  193. */
  194. public function columnCirculationInfo(string $label = '流转信息'): Column
  195. {
  196. return $this->grid->column('user_id', $label)->display(function ($userId) {
  197. $fromPointId = $this->from_point_id;
  198. $toPointId = $this->to_point_id;
  199. $pointTypes = [
  200. 1 => '经验积分',
  201. 2 => '成就积分',
  202. 3 => '活动积分',
  203. 4 => '签到积分',
  204. 5 => '推荐积分',
  205. ];
  206. if (is_object($fromPointId)) {
  207. $fromPointId = $fromPointId->value;
  208. }
  209. if (is_object($toPointId)) {
  210. $toPointId = $toPointId->value;
  211. }
  212. $fromPointName = $pointTypes[$fromPointId] ?? "积分{$fromPointId}";
  213. $toPointName = $pointTypes[$toPointId] ?? "积分{$toPointId}";
  214. return "用户: {$userId}<br>从: {$fromPointName}<br>到: {$toPointName}";
  215. });
  216. }
  217. /**
  218. * 添加积分转账信息组合列
  219. *
  220. * 复用价值:高 - 将转账的来源和目标用户信息组合显示
  221. *
  222. * @param string $label 标签名
  223. * @return Column
  224. */
  225. public function columnTransferInfo(string $label = '转账信息'): Column
  226. {
  227. return $this->grid->column('from_user_id', $label)->display(function ($fromUserId) {
  228. $toUserId = $this->to_user_id;
  229. $pointId = $this->point_id;
  230. $pointTypes = [
  231. 1 => '经验积分',
  232. 2 => '成就积分',
  233. 3 => '活动积分',
  234. 4 => '签到积分',
  235. 5 => '推荐积分',
  236. ];
  237. if (is_object($pointId)) {
  238. $pointId = $pointId->value;
  239. }
  240. $pointName = $pointTypes[$pointId] ?? "积分{$pointId}";
  241. return "从: 用户{$fromUserId}<br>到: 用户{$toUserId}<br>类型: {$pointName}";
  242. });
  243. }
  244. /**
  245. * 添加状态列
  246. *
  247. * @param string $field 字段名
  248. * @param string $label 标签名
  249. * @return Column
  250. */
  251. public function columnStatus(string $field = 'status', string $label = '状态'): Column
  252. {
  253. return $this->grid->column($field, $label)->using([
  254. 0 => '待处理',
  255. 1 => '已完成',
  256. 2 => '已失败',
  257. ])->label([
  258. 0 => 'warning',
  259. 1 => 'success',
  260. 2 => 'danger',
  261. ]);
  262. }
  263. }