JgPush.php 17.0 KB
<?php
/**
 * Created by PhpStorm.
 * User: Kevin
 * Date: 2022/03/16 1500
 * Time: 15:00
 */

namespace app\api\controller\getui;

use think\Db;
use think\Request;

/**
 * 监管APP推送(unipush)
 * @package app\api\controller\core
 */
class JgPush extends JGBase
{

    /**
     * 4. unipush推送通知消息至监管APP点击跳转通知详情
     */
    public function pushMessage($id)
    {
        if (empty($id)) {
            return array_callback(false, "id不能为空");
        }
        $messageModel = new \app\admin\model\inspection\Message();
        $messageInfo = $messageModel->where("id", $id)->find();
        $sum_count = 0;//总共需要推送的人
        $react_count = 0;//实际推送人数
        if (!empty($messageInfo)) {

            $title = sub_str($messageInfo->title, 20);//通知消息标题,长度 ≤ 50
            $content = sub_str($messageInfo->content, 50);//通知消息内容,长度 ≤ 256
            $scene_type = "jump_to_message_page";
            $scene_data = ["id" => $messageInfo->id, "type" => 0];//type 0未读

            if (!empty($messageInfo->user_ids)) {
                $user_ids = trim($messageInfo->user_ids, ",");
                if (!empty($user_ids)) {
                    $sum_count = count(explode(",", $user_ids));
//                    查找需要推送人的clientid
                    $w1 = [];
                    $w1["id"] = ["in", $user_ids];
                    $w1["clientid"] = ["neq", ""];
                    $clientid_list = Db::name("user")->where($w1)->column("clientid");
                    if (!empty($clientid_list)) {
                        $react_count = count($clientid_list);
                        //请求推送
                        $push = new \GTPushRequest();
                        $push->setRequestId($this->micro_time);
                        $message = new \GTPushMessage();
                        $notify = new \GTNotification();
                        $notify->setTitle($title);
                        $notify->setBody($content);
                        //点击通知后续动作,目前支持以下后续动作:
                        //1、intent:打开应用内特定页面url:打开网页地址。2、payload:自定义消息内容启动应用。3、payload_custom:自定义消息内容不启动应用。4、startapp:打开应用首页。5、none:纯通知,无后续动作
                        $notify->setClickType("payload");
                        $array = ["scene_type" => $scene_type, "data" => $scene_data];
                        $notify->setPayload(json_encode($array, JSON_UNESCAPED_UNICODE));
                        $message->setNotification($notify);
                        $push->setPushMessage($message);

                        $push->setGroupName("message_" . $messageInfo->id);
                        $rr = $this->api->pushApi()->createListMsg($push);//【toList】创建消息;此接口用来创建消息体,并返回taskid,为批量推的前置步骤
                        if (!empty($rr)) {
                            if ($rr["code"] == 0) {
                                $taskid = $rr["data"]['taskid'];//任务编号,用于执行cid批量推和执行别名批量推,此taskid可以多次使用,有效期为用户设置的离线时间
                                if (!empty($taskid)) {
                                    //执行cid批量推
                                    $user = new \GTAudienceRequest();
                                    $user->setTaskid($taskid);
                                    $user->setCidList($clientid_list);
                                    $result = $this->api->pushApi()->pushListByCid($user);
                                    if (!empty($result)) {
                                        if ($result['code'] == 0) {
//                                            $this->success("推送成功", $result);
                                            return array_callback(true, "推送成功", ["result" => $result, "sum_count" => $sum_count, "react_count" => $react_count]);

                                        } else {
                                            return array_callback(false, "推送异常[" . $result['code'] . $result['msg'] . "]");
                                        }
                                    } else {
                                        return array_callback(false, "推送失败");
                                    }

                                } else {
                                    return array_callback(false, "消息体任务编号创建异常");
                                }
                            } else {
                                return array_callback(false, "创建消息体异常[" . $rr['code'] . $rr['msg'] . "]");
                            }
                        } else {
                            return array_callback(false, "创建消息体失败");
                        }

                    } else {
                        return array_callback(false, "通知人员clientid都为空,建议让TA们重新登录APP");
                    }

                }
            }
            return array_callback(false, "请先选择需要通知的人员");

        } else {
            return array_callback(false, "未查找到需要推送的数据");
        }

    }


    /**
     * 5. unipush推送事务消息至监管APP点击跳转待办事项详情
     */
    public function pushTask($id)
    {
        if (empty($id)) {
            return array_callback(false, "id不能为空");
        }
        $taskModel = new \app\admin\model\inspection\Task();
        $taskInfo = $taskModel->where("id", $id)->find();
        $sum_count = 0;//总共需要推送的人
        $react_count = 0;//实际推送人数
        if (!empty($taskInfo)) {

            $title = sub_str($taskInfo->title, 20);//通知消息标题,长度 ≤ 50
            $content = sub_str($taskInfo->desc, 50);//通知消息内容,长度 ≤ 256
            $scene_type = "jump_to_task_page";
            $scene_data = ["id" => $taskInfo->id, "type" => "未读"];//type 0未读

            if (!empty($taskInfo->user_id)) {
                $user_ids = trim($taskInfo->user_id, ",");
                if (!empty($user_ids)) {
                    $sum_count = count(explode(",", $user_ids));
//                    查找需要推送人的clientid
                    $w1 = [];
                    $w1["id"] = ["in", $user_ids];
                    $w1["clientid"] = ["neq", ""];
                    $clientid_list = Db::name("user")->where($w1)->column("clientid");
                    if (!empty($clientid_list)) {
                        $react_count = count($clientid_list);
                        //请求推送
                        $push = new \GTPushRequest();
                        $push->setRequestId($this->micro_time);
                        $message = new \GTPushMessage();
                        $notify = new \GTNotification();
                        $notify->setTitle($title);
                        $notify->setBody($content);
                        //点击通知后续动作,目前支持以下后续动作:
                        //1、intent:打开应用内特定页面url:打开网页地址。2、payload:自定义消息内容启动应用。3、payload_custom:自定义消息内容不启动应用。4、startapp:打开应用首页。5、none:纯通知,无后续动作
                        $notify->setClickType("payload");
                        $array = ["scene_type" => $scene_type, "data" => $scene_data];
                        $notify->setPayload(json_encode($array, JSON_UNESCAPED_UNICODE));
                        $message->setNotification($notify);
                        $push->setPushMessage($message);

                        $push->setGroupName("task_" . $taskInfo->id);
                        $rr = $this->api->pushApi()->createListMsg($push);//【toList】创建消息;此接口用来创建消息体,并返回taskid,为批量推的前置步骤
                        if (!empty($rr)) {
                            if ($rr["code"] == 0) {
                                $taskid = $rr["data"]['taskid'];//任务编号,用于执行cid批量推和执行别名批量推,此taskid可以多次使用,有效期为用户设置的离线时间
                                if (!empty($taskid)) {
                                    //执行cid批量推
                                    $user = new \GTAudienceRequest();
                                    $user->setTaskid($taskid);
                                    $user->setCidList($clientid_list);
                                    $result = $this->api->pushApi()->pushListByCid($user);
                                    if (!empty($result)) {
                                        if ($result['code'] == 0) {
//                                            $this->success("推送成功", $result);
                                            return array_callback(true, "推送成功", ["result" => $result, "sum_count" => $sum_count, "react_count" => $react_count]);

                                        } else {
                                            return array_callback(false, "推送异常[" . $result['code'] . $result['msg'] . "]");
                                        }
                                    } else {
                                        return array_callback(false, "推送失败");
                                    }

                                } else {
                                    return array_callback(false, "消息体任务编号创建异常");
                                }
                            } else {
                                return array_callback(false, "创建消息体异常[" . $rr['code'] . $rr['msg'] . "]");
                            }
                        } else {
                            return array_callback(false, "创建消息体失败");
                        }

                    } else {
                        return array_callback(false, "通知人员clientid都为空,建议让TA们重新登录APP");
                    }

                }
            }
            return array_callback(false, "请先选择需要通知的人员");

        } else {
            return array_callback(false, "未查找到需要推送的数据");
        }

    }


    /**
     * 2. 推送API_根据cid进行单推
     */
    public function pushToSingleByCid()
    {
        $param = $this->request->param();

        $cid = $param['cid'];
        $title = $param['title'];
        $content = $param['content'];
        $scene_type = $param['scene_type'] ? $param['scene_type'] : "default";

        if (empty($cid)) {
            $this->error("接收通知者id不能为空");
        }

        $push = new \GTPushRequest();
        $push->setRequestId($this->micro_time);
        $message = new \GTPushMessage();
        $notify = new \GTNotification();
        $notify->setTitle($title);
        $notify->setBody($content);
        //点击通知后续动作,目前支持以下后续动作:
        //1、intent:打开应用内特定页面url:打开网页地址。2、payload:自定义消息内容启动应用。3、payload_custom:自定义消息内容不启动应用。4、startapp:打开应用首页。5、none:纯通知,无后续动作
        $notify->setClickType("payload");
        $array = ["scene_type" => $scene_type];
        $notify->setPayload(json_encode($array, JSON_UNESCAPED_UNICODE));
        $message->setNotification($notify);
        $push->setPushMessage($message);
        $push->setCid($cid);
        //处理返回结果
        $result = $this->api->pushApi()->pushToSingleByCid($push);

        $status = "";
        if (!empty($result)) {
            if ($result['code'] == 0) {
                $data = $result['data'];
                if (!empty($data)) {
                    foreach ($data as $k => $v) {
                        if (!empty($v[$cid])) {
                            $status = $v[$cid];
                            break;
                        }
                    }
                }
                $this->success("请求成功", $status);
            } else {
                $this->error("请求异常[" . $result['code'] . $result['msg'] . "]");
            }
        } else {
            $this->error("unipush服务器请求异常");
        }
    }


    /**
     * 14. unipush推送入侵报警至监管APP点击跳转实时监控详情
     * "u_ids" => $u_ids,
     * "indexCode" => $cameraIndexCode,
     * "name" => Db::name("reservoir_hkws_hardware")->where("indexCode", $cameraIndexCode)->value("name"),
     * "title" => "您有新的入侵报警消息,请及时查看",
     * "desc" => "你好,系统监测反馈有新的入侵报警,请及时查看并处理"
     */
    public function pushAlarm($param)
    {
        if (empty($param['u_ids'])) {
            return array_callback(false, "推送用户不能为空");
        }
        $sum_count = 0;//总共需要推送的人
        $react_count = 0;//实际推送人数
        $title = $param['title'] ? sub_str($param['title'], 20) : "新的入侵报警待查看";//通知消息标题,长度 ≤ 50
        $content = $param['desc'] ? sub_str($param['desc'], 50) : "您有新的入侵报警信息待查看";//通知消息内容,长度 ≤ 256
        $scene_type = $param['jump_page'] ? $param['jump_page'] : "jump_to_rtmonitor_page";
        $scene_data = ["indexCode" => $param['indexCode'], "name" => $param['name']];//

        $user_ids = trim($param['u_ids'], ",");
        if (!empty($user_ids)) {
            $sum_count = count(explode(",", $user_ids));
//                    查找需要推送人的clientid
            $w1 = [];
            $w1["id"] = ["in", $user_ids];
            $w1["clientid"] = ["neq", ""];
            $clientid_list = Db::name("user")->where($w1)->column("clientid");
            if (!empty($clientid_list)) {
                $react_count = count($clientid_list);
                //请求推送
                $push = new \GTPushRequest();
                $push->setRequestId($this->micro_time);
                $message = new \GTPushMessage();
                $notify = new \GTNotification();
                $notify->setTitle($title);
                $notify->setBody($content);
                //点击通知后续动作,目前支持以下后续动作:
                //1、intent:打开应用内特定页面url:打开网页地址。2、payload:自定义消息内容启动应用。3、payload_custom:自定义消息内容不启动应用。4、startapp:打开应用首页。5、none:纯通知,无后续动作
                $notify->setClickType("payload");
                $array = ["scene_type" => $scene_type, "data" => $scene_data];
                $notify->setPayload(json_encode($array, JSON_UNESCAPED_UNICODE));
                $message->setNotification($notify);
                $push->setPushMessage($message);

                $push->setGroupName("alarm_" . $param['alarm_id']);
                $rr = $this->api->pushApi()->createListMsg($push);//【toList】创建消息;此接口用来创建消息体,并返回taskid,为批量推的前置步骤
                if (!empty($rr)) {
                    if ($rr["code"] == 0) {
                        $taskid = $rr["data"]['taskid'];//任务编号,用于执行cid批量推和执行别名批量推,此taskid可以多次使用,有效期为用户设置的离线时间
                        if (!empty($taskid)) {
                            //执行cid批量推
                            $user = new \GTAudienceRequest();
                            $user->setTaskid($taskid);
                            $user->setCidList($clientid_list);
                            $result = $this->api->pushApi()->pushListByCid($user);
                            if (!empty($result)) {
                                if ($result['code'] == 0) {
//                                            $this->success("推送成功", $result);
                                    return array_callback(true, "推送成功", ["result" => $result, "sum_count" => $sum_count, "react_count" => $react_count]);

                                } else {
                                    return array_callback(false, "推送异常[" . $result['code'] . $result['msg'] . "]");
                                }
                            } else {
                                return array_callback(false, "推送失败");
                            }

                        } else {
                            return array_callback(false, "消息体任务编号创建异常");
                        }
                    } else {
                        return array_callback(false, "创建消息体异常[" . $rr['code'] . $rr['msg'] . "]");
                    }
                } else {
                    return array_callback(false, "创建消息体失败");
                }

            } else {
                return array_callback(false, "通知人员clientid都为空,建议让TA们重新登录APP");
            }

        }
        return array_callback(false, "请先选择需要通知的人员");


    }

}