ToData.php 5.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170
  1. <?php
  2. /**
  3. * User: 乃火
  4. * Time: 2021/2/21 1:16 下午
  5. * QQ: 1123416584
  6. */
  7. namespace addons\notice\library;
  8. use addons\third\Third;
  9. use app\admin\model\Admin;
  10. use app\admin\model\AuthGroup;
  11. use app\admin\model\notice\AdminMptemplate;
  12. use app\common\model\User;
  13. use think\db\Query;
  14. use think\Hook;
  15. /**
  16. * 消息接收者处理
  17. * Class ToData
  18. *
  19. * @package addons\notice\library
  20. */
  21. class ToData
  22. {
  23. /**
  24. * 获取发送对象(可以自定义调整)
  25. */
  26. public static function get($event,$template, $params)
  27. {
  28. // 接收信息
  29. $toData = [
  30. 'to' => [],
  31. // 所有接收者id,根据这个创建消息记录
  32. 'to_id' => [],
  33. // 所有接收者email
  34. 'email' => [],
  35. // 触发消息者user
  36. 'user' => null,
  37. // 默认参数字段
  38. 'default_field' => [],
  39. // 接收模版消息(公众号)openid
  40. 'mptemplate_openid' => [],
  41. 'template' => $template,
  42. 'params' => $params
  43. ];
  44. $to = [];
  45. $mptemplateOpenid = [];
  46. // 找出user_id用户
  47. if (isset($params['user_id'])) {
  48. $user = User::get($params['user_id']);
  49. } else {
  50. $user = null;
  51. }
  52. // 前台通知
  53. if ($template['platform'] == 'user') {
  54. if ($user) {
  55. $to = [$user];
  56. }
  57. }
  58. // 后台通知
  59. if ($template['platform'] == 'admin') {
  60. $groupId = get_addon_config('notice')['only_admin_group_id'];
  61. if (!is_array($groupId)) {
  62. $groupId = explode(',', $groupId);
  63. $groupId = array_filter($groupId);
  64. }
  65. $receiver_admin_ids = $params['receiver_admin_ids'] ?? [];
  66. if (!is_array($receiver_admin_ids)) {
  67. $receiver_admin_ids = explode(',', $receiver_admin_ids);
  68. $receiver_admin_ids = array_filter($receiver_admin_ids);
  69. }
  70. $receiver_admin_group_ids = $params['receiver_admin_group_ids'] ?? [];
  71. if (!is_array($receiver_admin_group_ids)) {
  72. $receiver_admin_group_ids = explode(',', $receiver_admin_group_ids);
  73. $receiver_admin_group_ids = array_filter($receiver_admin_group_ids);
  74. }
  75. $groupId = array_merge($groupId, $receiver_admin_group_ids);
  76. if ($receiver_admin_ids) {
  77. $adminWhere = ['__TABLE__.id' => ['in', $receiver_admin_ids]];
  78. } else {
  79. $adminWhere = [];
  80. }
  81. if ($groupId) {
  82. $to = Admin::join('auth_group_access', 'auth_group_access.uid = id')
  83. ->where('group_id', 'in', $groupId)
  84. ->where($adminWhere)
  85. ->select();
  86. } else {
  87. $to = Admin::where($adminWhere)->select();
  88. }
  89. }
  90. // 判断是否为邮件发送
  91. if ($template['type'] == 'email') {
  92. $to = array_filter($to, function($row) {
  93. return $row['email'];
  94. });
  95. }
  96. // 判断是否为后台模版通知
  97. if ($template['type'] == 'mptemplate' && $template['platform'] == 'admin') {
  98. $adminMptemplateList = AdminMptemplate::where('admin_id', 'in', array_column($to, 'id'))->select();
  99. $adminMptemplateAdminIds = array_column($adminMptemplateList, 'admin_id');
  100. foreach ($to as $k=>$v) {
  101. if (!in_array($v['id'], $adminMptemplateAdminIds)) {
  102. unset($to[$k]);
  103. }
  104. }
  105. $to = array_values($to);
  106. $mptemplateOpenid = array_column($adminMptemplateList, 'openid');
  107. }
  108. // 判断是否为前台模版通知
  109. if ($template['type'] == 'mptemplate' && $template['platform'] == 'user') {
  110. // 有第三方登录表
  111. if (class_exists('\app\admin\model\Third')) {
  112. $userMptemplateList = \app\admin\model\Third::where('user_id', 'in', array_column($to, 'id'))
  113. ->where('platform', 'wechat')
  114. ->where(function(Query $query) {
  115. $query->where('apptype', 'mp')
  116. ->whereOr('apptype', '');
  117. })
  118. ->select();
  119. } else {
  120. $userMptemplateList = [];
  121. }
  122. $userMptemplateAdminIds = array_column($userMptemplateList, 'user_id');
  123. foreach ($to as $k=>$v) {
  124. if (!in_array($v['id'], $userMptemplateAdminIds)) {
  125. unset($to[$k]);
  126. }
  127. }
  128. $to = array_values($to);
  129. $mptemplateOpenid = array_column($userMptemplateList, 'openid');
  130. }
  131. if (count($to) == 0) {
  132. return_error('接收者不存在');
  133. }
  134. $toData['to'] = $to;
  135. $toData['mptemplate_openid'] = $mptemplateOpenid;
  136. $toData['email'] = array_column($to, 'email');
  137. $toData['to_id'] = array_column($to, 'id');
  138. $toData['user'] = $user;
  139. $toData['default_field'] = [
  140. 'user_id' => $user['id'] ?? '',
  141. 'user_nickname' => $user['nickname'] ?? '',
  142. 'user_email' => $user['email'] ?? '',
  143. 'user_mobile' => $user['mobile'] ?? '',
  144. 'createtime_text' => date('Y-m-d H:i:s'),
  145. 'createdate' => date('Y-m-d')
  146. ];
  147. Hook::listen('notice_to_data', $toData);
  148. return $toData;
  149. }
  150. }