2025-08-01 11:39:06 +08:00

205 lines
6.8 KiB
PHP

<?php
/**
* User: 乃火
* Time: 2021/2/21 1:16 下午
* QQ: 1123416584
*/
namespace addons\notice\library;
use addons\third\Third;
use app\admin\model\Admin;
use app\admin\model\AuthGroup;
use app\admin\model\notice\AdminMptemplate;
use app\common\model\User;
use think\db\Query;
use think\Hook;
/**
* 消息接收者处理
* Class ToData
*
* @package addons\notice\library
*/
class ToData
{
/**
* 获取发送对象(可以自定义调整)
*/
public static function get($event,$template, $params)
{
// 接收信息
$toData = [
'to' => [],
// 所有接收者id,根据这个创建消息记录
'to_id' => [],
// 所有接收者email
'email' => [],
'mobile' => [],
// 触发消息者user
'user' => null,
// 默认参数字段
'default_field' => [],
// 接收模版消息(公众号)openid
'mptemplate_openid' => [],
'template' => $template,
'params' => $params,
'event' => $event
];
$to = [];
$mptemplateOpenid = [];
// 找出user_id用户
if (isset($params['user_id'])) {
$user = User::get($params['user_id']);
} else {
$user = null;
}
// 前台通知
if ($template['platform'] == 'user') {
if ($user) {
$to = [$user];
}
}
// 后台通知
if ($template['platform'] == 'admin') {
$groupId = get_addon_config('notice')['only_admin_group_id'];
if (!is_array($groupId)) {
$groupId = explode(',', $groupId);
$groupId = array_filter($groupId);
}
$receiver_admin_ids = $params['receiver_admin_ids'] ?? [];
if (!is_array($receiver_admin_ids)) {
$receiver_admin_ids = explode(',', $receiver_admin_ids);
$receiver_admin_ids = array_filter($receiver_admin_ids);
}
$receiver_admin_group_ids = $params['receiver_admin_group_ids'] ?? [];
if (!is_array($receiver_admin_group_ids)) {
$receiver_admin_group_ids = explode(',', $receiver_admin_group_ids);
$receiver_admin_group_ids = array_filter($receiver_admin_group_ids);
}
$groupId = array_merge($groupId, $receiver_admin_group_ids);
if ($receiver_admin_ids) {
$adminWhere = ['__TABLE__.id' => ['in', $receiver_admin_ids]];
} else {
$adminWhere = [];
}
if ($groupId) {
$to = Admin::join('auth_group_access', 'auth_group_access.uid = id')
->where('group_id', 'in', $groupId)
->where($adminWhere)
->select();
} else {
$to = Admin::where($adminWhere)->select();
}
}
// 判断是否为邮件发送
if ($template['type'] == 'email') {
$to = array_filter($to, function($row) {
return $row['email'];
});
}
// 判断是否为短信发送
if ($template['type'] == 'sms') {
$to = array_filter($to, function($row) {
return $row['mobile'];
});
}
// 判断是否为后台模版通知
if ($template['type'] == 'mptemplate' && $template['platform'] == 'admin') {
$adminMptemplateList = AdminMptemplate::where('admin_id', 'in', array_column($to, 'id'))->select();
$adminMptemplateAdminIds = array_column($adminMptemplateList, 'admin_id');
foreach ($to as $k=>$v) {
if (!in_array($v['id'], $adminMptemplateAdminIds)) {
unset($to[$k]);
}
}
$to = array_values($to);
$mptemplateOpenid = array_column($adminMptemplateList, 'openid');
}
// 判断是否为前台模版通知
if ($template['type'] == 'mptemplate' && $template['platform'] == 'user') {
// 有第三方登录表
if (class_exists('\app\admin\model\Third')) {
$userMptemplateList = \app\admin\model\Third::where('user_id', 'in', array_column($to, 'id'))
->where('platform', 'wechat')
->where(function(Query $query) {
$query->where('apptype', 'mp')
->whereOr('apptype', '');
})
->select();
} else {
$userMptemplateList = [];
}
$userMptemplateAdminIds = array_column($userMptemplateList, 'user_id');
foreach ($to as $k=>$v) {
if (!in_array($v['id'], $userMptemplateAdminIds)) {
unset($to[$k]);
}
}
$to = array_values($to);
$mptemplateOpenid = array_column($userMptemplateList, 'openid');
}
// 判断是否为前台订阅消息
if ($template['type'] == 'miniapp' && $template['platform'] == 'user') {
// 有第三方登录表
if (class_exists('\app\admin\model\Third')) {
$userMptemplateList = \app\admin\model\Third::where('user_id', 'in', array_column($to, 'id'))
->where('platform', 'wechat')
->where(function(Query $query) {
$query->where('apptype', 'miniapp')
->whereOr('apptype', 'mini');
})
->select();
} else {
$userMptemplateList = [];
}
$userMptemplateAdminIds = array_column($userMptemplateList, 'user_id');
foreach ($to as $k=>$v) {
if (!in_array($v['id'], $userMptemplateAdminIds)) {
unset($to[$k]);
}
}
$to = array_values($to);
$mptemplateOpenid = array_column($userMptemplateList, 'openid');
}
$toData['to'] = $to;
$toData['mptemplate_openid'] = $mptemplateOpenid;
$toData['email'] = array_column($to, 'email');
$toData['mobile'] = array_column($to, 'mobile');
$toData['to_id'] = array_column($to, 'id');
$toData['user'] = $user;
$toData['default_field'] = [
'user_id' => $user['id'] ?? '',
'user_nickname' => $user['nickname'] ?? '',
'user_email' => $user['email'] ?? '',
'user_mobile' => $user['mobile'] ?? '',
'createtime_text' => date('Y-m-d H:i:s'),
'createdate' => date('Y-m-d')
];
Hook::listen('notice_to_data', $toData);
if (count($toData['to_id']) == 0) {
return_error('接收者不存在');
}
return $toData;
}
}