UrsUserReferralController.php 15 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342
  1. <?php
  2. namespace App\Module\UrsPromotion\AdminControllers;
  3. use UCore\DcatAdmin\AdminController;
  4. use Spatie\RouteAttributes\Attributes\Resource;
  5. use App\Module\UrsPromotion\Models\UrsUserReferral;
  6. use App\Module\UrsPromotion\Models\UrsUserMapping;
  7. use App\Module\UrsPromotion\Repositorys\UrsUserReferralRepository;
  8. use Dcat\Admin\Grid;
  9. use Dcat\Admin\Show;
  10. use Dcat\Admin\Form;
  11. /**
  12. * URS用户推荐关系管理控制器
  13. *
  14. * @route /admin/urs-promotion/user-referrals
  15. */
  16. #[Resource('urs-promotion/user-referrals', names: 'dcat.admin.urs-promotion.user-referrals')]
  17. class UrsUserReferralController extends AdminController
  18. {
  19. /**
  20. * 页面标题
  21. */
  22. protected $title = 'URS用户推荐关系';
  23. /**
  24. * 模型类
  25. */
  26. protected $model = UrsUserReferral::class;
  27. /**
  28. * 仓库类
  29. */
  30. protected $repository = UrsUserReferralRepository::class;
  31. /**
  32. * 列表页面
  33. */
  34. protected function grid(): Grid
  35. {
  36. // 实例化仓库时传入with数组
  37. $repository = new UrsUserReferralRepository([
  38. // 直接关联的农场用户信息
  39. 'user.info',
  40. 'referrer.info',
  41. // 通过映射关系的用户信息(向后兼容)
  42. 'userMapping' => function($query) {
  43. $query->where('status', UrsUserMapping::STATUS_VALID)
  44. ->with('user.info');
  45. },
  46. 'referrerMapping' => function($query) {
  47. $query->where('status', UrsUserMapping::STATUS_VALID)
  48. ->with('user.info');
  49. }
  50. ]);
  51. return Grid::make($repository, function (Grid $grid) {
  52. $grid->column('id', 'ID')->sortable();
  53. $grid->column('urs_user_id', 'URS用户ID')->sortable()->display(function ($value) {
  54. // 添加到用户绑定和达人等级的链接
  55. $mappingUrl = admin_url('urs-promotion/user-mappings?urs_user_id=' . $value);
  56. $talentUrl = admin_url('urs-promotion/user-talents?urs_user_id=' . $value);
  57. return $value . '<br><small>
  58. <a href="' . $mappingUrl . '" class="text-primary">查看绑定关系</a> |
  59. <a href="' . $talentUrl . '" class="text-success">查看达人等级</a>
  60. </small>';
  61. });
  62. // 农场用户ID字段
  63. $grid->column('user_id', '农场用户ID')->sortable()->display(function ($value) {
  64. if ($value == 0) {
  65. return '<span class="text-muted">未进入农场</span>';
  66. }
  67. // 添加到用户详情的链接
  68. $userUrl = admin_url('users/' . $value);
  69. return '<a href="' . $userUrl . '" class="text-info" target="_blank">' . $value . '</a>';
  70. });
  71. $grid->column('referrer_id', '推荐人农场用户ID')->sortable()->display(function ($value) {
  72. if ($value == 0) {
  73. return '<span class="text-muted">未进入农场</span>';
  74. }
  75. // 添加到用户详情的链接
  76. $userUrl = admin_url('users/' . $value);
  77. return '<a href="' . $userUrl . '" class="text-info" target="_blank">' . $value . '</a>';
  78. });
  79. $grid->column('urs_referrer_id', 'URS推荐人ID')->sortable()->display(function ($value) {
  80. // 添加到推荐人信息的链接
  81. $mappingUrl = admin_url('urs-promotion/user-mappings?urs_user_id=' . $value);
  82. $talentUrl = admin_url('urs-promotion/user-talents?urs_user_id=' . $value);
  83. return $value . '<br><small>
  84. <a href="' . $mappingUrl . '" class="text-primary">推荐人绑定</a> |
  85. <a href="' . $talentUrl . '" class="text-success">推荐人等级</a>
  86. </small>';
  87. });
  88. // 农场用户信息列
  89. $grid->column('userMapping.user.username', '农场用户名')->display(function ($value) {
  90. return $value ?: '<span class="label label-warning">未进入农场</span>';
  91. });
  92. $grid->column('userMapping.user.info.nickname', '农场用户昵称')->display(function ($value) {
  93. return $value ?: '<span class="text-muted">无昵称</span>';
  94. });
  95. // 推荐人农场用户信息列
  96. $grid->column('referrerMapping.user.username', '推荐人农场用户名')->display(function ($value) {
  97. return $value ?: '<span class="label label-warning">未进入农场</span>';
  98. });
  99. $grid->column('referrerMapping.user.info.nickname', '推荐人农场昵称')->display(function ($value) {
  100. return $value ?: '<span class="text-muted">无昵称</span>';
  101. });
  102. $grid->column('referral_time', '推荐时间')->sortable();
  103. $grid->column('status', '状态')->using([
  104. UrsUserReferral::STATUS_INVALID => '无效',
  105. UrsUserReferral::STATUS_VALID => '有效',
  106. ])->label([
  107. UrsUserReferral::STATUS_INVALID => 'danger',
  108. UrsUserReferral::STATUS_VALID => 'success',
  109. ]);
  110. $grid->column('created_at', '创建时间')->sortable();
  111. // 禁用创建按钮(推荐关系由系统自动创建)
  112. $grid->disableCreateButton();
  113. // 只允许查看详情
  114. $grid->actions(function (Grid\Displayers\Actions $actions) {
  115. $actions->disableEdit();
  116. $actions->disableDelete();
  117. // 添加自定义操作
  118. $actions->append(new \App\Module\UrsPromotion\AdminControllers\Actions\ViewReferralTreeAction());
  119. $actions->append(new \App\Module\UrsPromotion\AdminControllers\Actions\ViewReferralChainAction());
  120. $actions->append(new \App\Module\UrsPromotion\AdminControllers\Actions\ValidateReferralAction());
  121. });
  122. $grid->filter(function (Grid\Filter $filter) {
  123. $filter->equal('urs_user_id', 'URS用户ID');
  124. $filter->equal('urs_referrer_id', 'URS推荐人ID');
  125. $filter->equal('user_id', '农场用户ID');
  126. $filter->equal('referrer_id', '推荐人农场用户ID');
  127. $filter->equal('status', '状态')->select([
  128. UrsUserReferral::STATUS_INVALID => '无效',
  129. UrsUserReferral::STATUS_VALID => '有效',
  130. ]);
  131. $filter->between('created_at', '创建时间')->datetime();
  132. });
  133. });
  134. }
  135. /**
  136. * 详情页面
  137. */
  138. protected function detail($id): Show
  139. {
  140. // 实例化仓库时传入with数组
  141. $repository = new UrsUserReferralRepository([
  142. 'user.info',
  143. 'referrer.info',
  144. 'userMapping' => function($query) {
  145. $query->where('status', UrsUserMapping::STATUS_VALID)
  146. ->with('user.info');
  147. },
  148. 'referrerMapping' => function($query) {
  149. $query->where('status', UrsUserMapping::STATUS_VALID)
  150. ->with('user.info');
  151. }
  152. ]);
  153. return Show::make($id, $repository, function (Show $show) {
  154. $show->field('id', 'ID');
  155. $show->field('urs_user_id', 'URS用户ID');
  156. $show->field('urs_referrer_id', 'URS推荐人ID');
  157. // 农场用户ID字段
  158. $show->field('user_id', '农场用户ID')->as(function ($value) {
  159. if ($value == 0) {
  160. return '未进入农场';
  161. }
  162. return $value;
  163. });
  164. $show->field('referrer_id', '推荐人农场用户ID')->as(function ($value) {
  165. if ($value == 0) {
  166. return '未进入农场';
  167. }
  168. return $value;
  169. });
  170. // 农场用户信息
  171. $show->divider('农场用户信息');
  172. $show->field('farm_username', '农场用户名')->as(function ($value) {
  173. // 获取当前记录
  174. $referral = UrsUserReferral::with('user')->find($this->getKey());
  175. if (!$referral || $referral->user_id == 0) {
  176. return '未进入农场';
  177. }
  178. // 优先使用直接关联的农场用户信息
  179. if ($referral->user) {
  180. return $referral->user->username;
  181. }
  182. // 如果直接关联没有数据,回退到映射关系查询
  183. $userMapping = UrsUserMapping::where('urs_user_id', $referral->urs_user_id)
  184. ->where('status', UrsUserMapping::STATUS_VALID)
  185. ->with('user')
  186. ->first();
  187. if ($userMapping && $userMapping->user) {
  188. return $userMapping->user->username;
  189. }
  190. return '未进入农场';
  191. });
  192. $show->field('farm_nickname', '农场用户昵称')->as(function ($value) {
  193. // 获取当前记录
  194. $referral = UrsUserReferral::with('user.info')->find($this->getKey());
  195. if (!$referral || $referral->user_id == 0) {
  196. return '无昵称';
  197. }
  198. // 优先使用直接关联的农场用户信息
  199. if ($referral->user && $referral->user->info) {
  200. return $referral->user->info->nickname ?: '无昵称';
  201. }
  202. // 如果直接关联没有数据,回退到映射关系查询
  203. $userMapping = UrsUserMapping::where('urs_user_id', $referral->urs_user_id)
  204. ->where('status', UrsUserMapping::STATUS_VALID)
  205. ->with('user.info')
  206. ->first();
  207. if ($userMapping && $userMapping->user && $userMapping->user->info) {
  208. return $userMapping->user->info->nickname ?: '无昵称';
  209. }
  210. return '无昵称';
  211. });
  212. // 推荐人农场用户信息
  213. $show->divider('推荐人农场用户信息');
  214. $show->field('referrer_farm_username', '推荐人农场用户名')->as(function ($value) {
  215. // 获取当前记录
  216. $referral = UrsUserReferral::with('referrer')->find($this->getKey());
  217. if (!$referral || $referral->referrer_id == 0) {
  218. return '未进入农场';
  219. }
  220. // 优先使用直接关联的农场用户信息
  221. if ($referral->referrer) {
  222. return $referral->referrer->username;
  223. }
  224. // 如果直接关联没有数据,回退到映射关系查询
  225. $referrerMapping = UrsUserMapping::where('urs_user_id', $referral->urs_referrer_id)
  226. ->where('status', UrsUserMapping::STATUS_VALID)
  227. ->with('user')
  228. ->first();
  229. if ($referrerMapping && $referrerMapping->user) {
  230. return $referrerMapping->user->username;
  231. }
  232. return '未进入农场';
  233. });
  234. $show->field('referrer_farm_nickname', '推荐人农场用户昵称')->as(function ($value) {
  235. // 获取当前记录
  236. $referral = UrsUserReferral::with('referrer.info')->find($this->getKey());
  237. if (!$referral || $referral->referrer_id == 0) {
  238. return '无昵称';
  239. }
  240. // 优先使用直接关联的农场用户信息
  241. if ($referral->referrer && $referral->referrer->info) {
  242. return $referral->referrer->info->nickname ?: '无昵称';
  243. }
  244. // 如果直接关联没有数据,回退到映射关系查询
  245. $referrerMapping = UrsUserMapping::where('urs_user_id', $referral->urs_referrer_id)
  246. ->where('status', UrsUserMapping::STATUS_VALID)
  247. ->with('user.info')
  248. ->first();
  249. if ($referrerMapping && $referrerMapping->user && $referrerMapping->user->info) {
  250. return $referrerMapping->user->info->nickname ?: '无昵称';
  251. }
  252. return '无昵称';
  253. });
  254. $show->divider('基本信息');
  255. $show->field('referral_time', '推荐时间');
  256. $show->field('status', '状态')->using([
  257. UrsUserReferral::STATUS_INVALID => '无效',
  258. UrsUserReferral::STATUS_VALID => '有效',
  259. ]);
  260. $show->field('created_at', '创建时间');
  261. $show->field('updated_at', '更新时间');
  262. // 添加相关链接区域
  263. $show->divider('相关信息');
  264. $show->field('related_links', '相关链接')->unescape()->as(function ($value) use ($show) {
  265. $model = $show->model();
  266. $links = [];
  267. // 用户绑定关系链接
  268. $userMappingUrl = admin_url('urs-promotion/user-mappings?urs_user_id=' . $model->urs_user_id);
  269. $links[] = '<a href="' . $userMappingUrl . '" class="btn btn-primary btn-sm" target="_blank">
  270. <i class="fa fa-link"></i> 用户绑定关系
  271. </a>';
  272. // 推荐人绑定关系链接
  273. $referrerMappingUrl = admin_url('urs-promotion/user-mappings?urs_user_id=' . $model->urs_referrer_id);
  274. $links[] = '<a href="' . $referrerMappingUrl . '" class="btn btn-primary btn-sm" target="_blank">
  275. <i class="fa fa-link"></i> 推荐人绑定关系
  276. </a>';
  277. // 用户达人等级链接
  278. $userTalentUrl = admin_url('urs-promotion/user-talents?urs_user_id=' . $model->urs_user_id);
  279. $links[] = '<a href="' . $userTalentUrl . '" class="btn btn-success btn-sm" target="_blank">
  280. <i class="fa fa-star"></i> 用户达人等级
  281. </a>';
  282. // 推荐人达人等级链接
  283. $referrerTalentUrl = admin_url('urs-promotion/user-talents?urs_user_id=' . $model->urs_referrer_id);
  284. $links[] = '<a href="' . $referrerTalentUrl . '" class="btn btn-success btn-sm" target="_blank">
  285. <i class="fa fa-star"></i> 推荐人达人等级
  286. </a>';
  287. return implode(' ', $links);
  288. });
  289. });
  290. }
  291. /**
  292. * 表单页面(禁用)
  293. */
  294. protected function form(): Form
  295. {
  296. return Form::make(new UrsUserReferralRepository([]), function (Form $form) {
  297. // 推荐关系由系统自动创建,不提供手动创建表单
  298. $form->display('message', '提示')->default('推荐关系由系统自动创建,不支持手动添加或编辑');
  299. });
  300. }
  301. }