205 lines
		
	
	
		
			6.8 KiB
		
	
	
	
		
			PHP
		
	
	
	
	
	
			
		
		
	
	
			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;
 | 
						|
    }
 | 
						|
 | 
						|
} |