123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216 |
- <?php
- namespace 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;
- }
- }
|