| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216 | <?phpnamespace app\queue;use app\common\model\Config;use app\common\model\Orders;use app\common\model\SmsLog;use app\common\util\AppMsg;use think\Db;use think\queue\Job;use tools\Qxsms;class Jobs{    /**     * 发送极光推送     * @param Job $job     * @param $data 例:{"users":[1,2,3],"type":1,"msg":"有新订单需要你的处理","extra"=>[]}     */    public function jpush(Job $job, $data){        $ndata = json_decode($data,true);        $ret = $this->sendJpush($ndata['users'],$ndata['type'],$ndata['msg'],$ndata['extra']);        if($ret){            $job->delete();        }else{            if ($job->attempts() > 2) { //重试2次任务失败后记录失败日志                $this->jobFail('jpush',$data);                $job->delete(); // 删除任务            }else{                $job->release(3); // 3秒后重新执行            }        }        // 增加信号量分发方法 暂时隐藏       // pcntl_signal_dispatch();    }    /**     * 短信发送     * @param Job $job     * @param $data {"orgId":1,"mobiles":["13838379498","13838379497"],"msg":"有新订单需要你的处理","fromId":0,"type":1}     */    public function qxsms(Job $job, $data){        $ndata = json_decode($data,true);        $ret = $this->sendSms($ndata['mobiles'],$ndata['msg'],$ndata['orgId'],$ndata['type']);        if($ret){            $job->delete();        }else{            if ($job->attempts() > 2) { //重试2次任务失败后记录失败日志                $this->jobFail('qxsms',$data);                $job->delete(); // 删除任务            }else{                $job->release(3); // 3秒后重新执行            }        }        // 增加信号量分发方法        //pcntl_signal_dispatch();    }    // 任务失败记录    private function jobFail($cate,$data){        Db::name('jobs_fail')->insert([            'cate' => $cate,            'payload' => $data,            'create_time' => date('Y-m-d H:i:s')        ]);    }    /**     * 发送短信     * @param array $mobiles 手机号     * @param string $msg 短信内容     * @param int $orgId     * @return bool     */    private function sendSms($mobiles=[],$msg='',$orgId=0,$fromId=0,$type=1){        if(!$mobiles){            return true;        }        try{            $config = config('app.sms_config');            if(empty($config['qx_corpid']) || empty($config['qx_pwd']) || empty($config['name'])){                exception('短信配置缺少');            }            $msg = '【'.$config['name'].'】'.$msg;            $sms = new Qxsms($config);            $smsonoff = (new Config())->getConfig('web_send_sms');            $smsorgonoff = (new Config())->getConfig('org_send_sms',$orgId);            if($smsonoff && $smsorgonoff){                $ret = $sms->send(implode(',',$mobiles),$msg);                if(!$ret){                    exception($sms->getError());                }                // 短信日志                (new SmsLog())->addLog(implode(',',$mobiles),$msg,$orgId,$fromId,$type);            }            return true;        }catch (\Exception $e){            trace('短信发送失败:'.$e->getMessage());            trace('短信发送号码:'.implode(',',$mobiles));            trace('短信发送内容:['.$orgId.']'.$msg);            return false;        }    }    /**     * 极光推送     * @param array $userids     * @param string $msg     * @param array $extras     */    private function sendJpush($userids,$type,$msg='',$extra=array()){        if(!$userids){            return true;        }        try { //不管推送成功与失败,不能影响正常业务流程            $jpushconfig = config('app.jpush');            $client = new \JPush\Client($jpushconfig['appkey'], $jpushconfig['mastersecret'],null);            $push = $client->push();            $push->setOptions(null,null,null, true);            $push->setPlatform(array('ios', 'android'));            foreach ($userids as $k=>$v){                $userids[$k] = (string)$v;            }            $push->addAlias($userids);            $extras = array('type'=>$type);            if($extra){                foreach ($extra as $k=>$v){                    if($k != 'type'){                        $extras[$k] = $v;                    }                }            }            $msg = AppMsg::getPushMsg($type,$msg);            $push->androidNotification($msg, array(                'extras' => $extras            ));            $sound = 'default';            if($type == 2 || $type == 7){                $sound = 'type'.$type.'.mp3';            }            $push->iosNotification($msg, array(                'sound' => $sound,                'badge' => '+1',                'extras' => $extras            ));            $ret = $push->send();            trace($ret);            return true;        } catch (\Exception $e) {            trace('push-error:'.$e->getMessage());            return false;        }    }    /**     * 自动派单轮转     * @param Job $job     */    public function autoSend(Job $job, $data){        $ndata = json_decode($data,true);        $ret = $this->toAutoSend($ndata);        if($ret){            $job->delete();        }else{            if ($job->attempts() > 2) { //重试2次任务失败后记录失败日志                $this->jobFail('autoSend',$data);                $job->delete(); // 删除任务            }else{                $job->release(3); // 3秒后重新执行            }        }    }    public function toAutoSend($ndata){        $min= (new Config())            ->getConfig('org_auto_send_time');        $time = intval($min);        if($time <5){            return true;        }        $orgId = $ndata['org_id'];        $orgGrabOrder = (new Config())            ->getConfig('org_grab_order1',$orgId);        if(!$orgGrabOrder){            return true;        }        $send_off= (new Config())            ->getConfig('org_auto_send',$orgId);        if(!$send_off){            return true;        }        $date = date('Y-m-d H:i:s',time()-(60*$time));        $orders = Db::name('orders')            ->alias('a')            ->join('order_repair b','a.id=b.order_id')            ->where('a.order_mode',1)            ->where('a.work_type_mode',1)            ->where('a.org_id',$orgId)            ->where('a.del',0)            ->where('a.create_time','<=',$date)            ->where('b.type_id','>',0)            ->field('a.id')            ->select();        foreach ($orders as $k=>$v){            (new Orders())->autoSend($v['id']);        }        return true;    }}
 |