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;
							 | 
						||
| 
								 | 
							
								    }
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								}
							 |