| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152 | <?phpnamespace App\Console\Commands;use Illuminate\Console\Command;use App\Modules\Subscribe\Services\OrderService;use Redis;use App\Libs\AliSMS;use Log;use DB;use App\Modules\Subscribe\Models\Order;class FailOrderAlertV2 extends Command{    /**     * The name and signature of the console command.     *     * @var string     */    protected $signature = 'foav2';    /**     * The console command description.     *     * @var string     */    protected $description = '失败订单预警';    /**     * Create a new command instance.     *     * @return void     */    public function __construct()    {        parent::__construct();    }    /**     * Execute the console command.     *     * @return mixed     */    public function handle()    {        $this->payAlert();    }    private function payAlert()    {        $pay_ids = $this->getPayId();        if(!$pay_ids){            return '';        }        foreach ($pay_ids as $pay_id){            $this->payAlertOne($pay_id);        }        return '';    }    private function payAlertOne($pay_id)    {        $phone_arr = ['15868100210','15088790066','13858057394','18668029091','18668420256','15869177764'];        $pay_info = Redis::hgetall('pay_merchant:'.$pay_id);        $is_need_alert = false;        $ntime = time();        $time_str = 180;           // 10min 15min 1.5min 3min 未支付的订单报警规则  96/103 倍道  97树羽        $alert_time_diff = ['1'=>180,'2'=>180];        if($pay_info)        {            $last_alert_time = isset($pay_info['last_alert_time']) ? (int)$pay_info['last_alert_time'] : 0;//上次报警时间            if($ntime - $last_alert_time > 180)//2小时内不重复报警            {                $unpaid_num = isset($pay_info['unpaid_num']) ?  (int)$pay_info['unpaid_num'] : 0;                $last_create_time = isset($pay_info['last_create_time']) ?  (int)$pay_info['last_create_time'] : 0;                $order_num = 10;                if($unpaid_num  >= $order_num)//超过30条都是失败订单报警                {                    $is_need_alert = true;                    $content = '订单预警!!!支付通道: '.$pay_id.',最近'.$order_num.'个订单都是未支付订单,尽快排查。。';                    $template_type = 'order_remind';                                        $back_pay = DB::table('pay_merchants')                        ->where('name','BD_BACK_UP_MAIN')                        ->where('is_enabled',1)                        ->select('id')->orderBy('id','desc')->first();                    if($back_pay){                        DB::table('distribution_channels')->where('pay_merchant_id',$pay_id)->update([                            'pay_merchant_id'=>$back_pay->id,                            'updated_at'=>date('Y-m-d H:i:s')                        ]);                        DB::table('pay_merchants')->where('id',$pay_id)->update(['name'=>'BD_DEFAULT2','updated_at'=>date('Y-m-d H:i:s')]);                        DB::table('pay_merchants')->where('id',$back_pay->id)->update(['name'=>'BD_DEFAULT','updated_at'=>date('Y-m-d H:i:s')]);                        $param = ['pay_id'=>$pay_id,'new_pay_id' => $back_pay->id];                        foreach ($phone_arr as $phone){                            $this->sendSms($phone, 'pay_channel_change',$param);                            $this->sendSms($phone, 'order_remind',$param);                        }                    }else{                       $param = ['pay_id'=>$pay_id];                        foreach ($phone_arr as $phone){                            $this->sendSms($phone, $template_type,$param);                        }                     }                }                if(isset($alert_time_diff[$pay_id])  && $last_create_time && ($ntime - $last_create_time) > $alert_time_diff[$pay_id] ){                    $is_need_alert = true;                    $content = '支付通道: '.$pay_id.' ,最近'.$time_str.'秒内没有产生一条订单,尽快排查';                    $template_type = 'order_halfhour_remind';                    $param = ['pay_id'=>$pay_id];                    foreach ($phone_arr as $phone){                        $this->sendSms($phone, $template_type,$param);                    }                }                if($is_need_alert)//更新报警时间                {                    Redis::hset('pay_merchant:'.$pay_id,'last_alert_time',$ntime);                }            }        }    }    /**     * 发送预警     */    private function sendSms($phone, $template_type,$param){        if(empty($phone)){            return false;        }        return AliSMS::send($phone, $template_type,$param);    }    private function getPayId(){        $sql = 'select distinct pay_merchant_id from distribution_channels where pay_merchant_id <>0 and id !=14';        $res = DB::select($sql);        $id_array = [];        if($res){            foreach ($res as $v){                $id_array[] = $v->pay_merchant_id;            }        }        return $id_array;    }}
 |