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