123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240 |
- <?php
- namespace App\Console\Commands\Trade;
- use App\Modules\SendOrder\Services\SendOrderForceDayStatService;
- use App\Modules\Trade\Models\OrderDayStat;
- use App\Modules\Trade\Services\OrderDayStatService;
- use App\Modules\Channel\Services\ChannelService;
- use App\Modules\Trade\Services\OrderStatService;
- use Log;
- use Illuminate\Console\Command;
- use DB;
- class GenerateOrderDayStat extends Command
- {
-
- protected $signature = 'generate_order_day_stat';
-
- protected $description = '渠道订单日统计数据生成';
-
- public function handle()
- {
- print_r("======渠道订单日统计数据生成 【任务执行开始】=====".date("y-m-d H:i:s"."\n"));
- Log::info("======渠道订单日统计数据生成 【任务执行开始】=====".date("y-m-d H:i:s"."\n"));
- $channels = ChannelService::getAllChannels();
- $date = date('Y-m-d',strtotime('-1 day'));
- $end_time = date('Y-m-d H:i:s',strtotime($date) + 86400-1);
- if(count($channels))
- {
- $min_uid = DB::table('users')->where('created_at','>=',$date)->min('id');
- $max_uid = DB::table('users')->where('created_at','>=',$date)->where('created_at','<=',$end_time)->max('id');
- $once_num = 5000;
- $offset = 0;
-
- $start_uid = $min_uid;
- $real_reg_data = [];
- while (true)
- {
- $offset += $once_num;
- $end_user = DB::table('users')->select('id')->where('created_at','>=',$date)->where('created_at','<=',$end_time)->skip($offset)->limit(1)->first();
- $end_uid = $end_user ? $end_user->id : $max_uid;
- $reg_data = DB::select("select distribution_channel_id,count(1) num from users u where id >= {$start_uid} and id <= {$end_uid} and not exists (select id from users where openid = u.openid and id < {$start_uid} limit 1) group by distribution_channel_id");
- foreach ($reg_data as $_reg_data)
- {
- @$real_reg_data[$_reg_data->distribution_channel_id] += (int)$_reg_data->num;
- }
- if($end_uid == $max_uid) break;
- $start_uid = $end_uid;
- }
- $channels->each(function($channel) use($date,$real_reg_data){
- $begin_time = strtotime($date)+86400;
- $real_reg_num = isset($real_reg_data[$channel->id]) ? $real_reg_data[$channel->id] : 0;
- if(strtotime($channel->created_at) <= $begin_time) OrderDayStatService::add($channel->id,$channel->channel_user_id, $date,$channel->nickname,$real_reg_num);
- });
- print_r("------订单汇总表更新start---");
- Log::info("======订单汇总表更新 【任务执行开始】=====".date("y-m-d H:i:s"."\n"));
- $channels->each(function($channel) use($date){
- OrderStatService::add($channel->id, $date);
- });
- Log::info("======订单汇总表更新 【任务执行结束】=====".date("y-m-d H:i:s"."\n"));
- print_r("-----订单汇总表更新end----");
-
- $this->generate_temp_table($date,$end_time);
- $subscribes = $this->getChannelSubscribeNumAndAmount($date);
- $channels->each(function($channel) use($subscribes,$date){
- $subscribe_num=0;
- $subscribe_amount=0;
- if(array_key_exists($channel->id,$subscribes)){
- $subscribe_num = $subscribes[$channel->id]['user_num'];
- $subscribe_amount = $subscribes[$channel->id]['sum_fee'];
- }
- OrderDayStat::where('date',$date)
- ->where('distribution_channel_id',$channel->id)
- ->update(['subscribe_user_num'=>$subscribe_num,'subscribe_amount'=>$subscribe_amount]);
- });
-
-
-
- }
- Log::info("======渠道订单日统计数据生成 【任务执行结束】=====".date("y-m-d H:i:s"."\n"));
- print_r("======渠道订单日统计数据生成 【任务执行结束】=====".date("y-m-d H:i:s"."\n"));
- }
- protected function generate_temp_table($date,$end_time){
- DB::connection('chapter_order_mysql')->update("truncate table temp_chapter_order");
- DB::connection('chapter_order_mysql')->update("call temp_chapter_order_update('{$date}','{$end_time}')");
- DB::table('book_orders')
- ->select(['uid','distribution_channel_id',DB::raw("date(created_at) as date"),DB::raw("sum(fee) as fee")])
- ->whereBetween('created_at',[$date,$end_time])
- ->groupBy('uid')
- ->orderBy('id')
- ->chunk(5000,function($book_orders){
- $book_orders=json_decode(json_encode($book_orders),true);
- DB::connection('chapter_order_mysql')->table('temp_chapter_order')->insert($book_orders);
- });
- }
- protected function getChannelSubscribeNumAndAmount($date){
- $orders = DB::connection('chapter_order_mysql')
- ->table('temp_chapter_order')
- ->select(DB::raw("distribution_channel_id,count(distinct uid) as user_num,sum(fee) as sum_fee"))
- ->where('date',$date)
- ->groupBy('distribution_channel_id')
- ->get();
- $res=[];
- foreach ($orders as $order){
- $res[$order->distribution_channel_id] = json_decode(json_encode($order),true);
- }
- return $res;
- }
- }
|