BookTest.php 16 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409
  1. <?php
  2. namespace App\Console\Commands;
  3. use App\Modules\Book\Services\BookSubscribleChapterService;
  4. use App\Modules\Subscribe\Services\ChapterOrderService;
  5. use App\Modules\YunQi\Models\BookUser;
  6. use App\Modules\YunQi\Models\YqUserBidRelation;
  7. use App\Modules\YunQi\Models\YqZsyTest;
  8. use App\Modules\YunQi\Services\YqZsyTestService;
  9. use GuzzleHttp\Client;
  10. use Illuminate\Console\Command;
  11. use Log;
  12. use DB;
  13. use Redis;
  14. use App\Modules\Book\Models\Book;
  15. use App\Modules\Book\Models\Chapter;
  16. use App\Modules\SendOrder\Models\SendOrder;
  17. use App\Modules\SendOrder\Services\SendOrderService;
  18. use App\Modules\Subscribe\Models\Order;
  19. use App\Jobs\SendStatisticsList;
  20. use App\Modules\OfficialAccount\Models\ForceSubscribeUsers;
  21. use App\Modules\User\Services\UserSignService;
  22. use App\Modules\Book\Models\BookUvStat;
  23. use App\Modules\Subscribe\Models\ChapterOrder;
  24. class BookTest extends Command
  25. {
  26. /**
  27. * The name and signature of the console command.
  28. *
  29. * @var string
  30. */
  31. protected $signature = 'book:test
  32. {--bid= : the id of a book}';
  33. /**
  34. * The console command description.
  35. *
  36. * @var string
  37. */
  38. protected $client;
  39. protected $description = 'Command description';
  40. /**
  41. * Create a new command instance.
  42. *
  43. * @return void
  44. */
  45. public function __construct()
  46. {
  47. parent::__construct();
  48. $this->client = new Client(['timeout' => 8.0, 'allow_redirects' => true]);
  49. }
  50. /**
  51. * Execute the console command.
  52. *
  53. * @return mixed
  54. */
  55. public function handle()
  56. {
  57. //$this->data1();
  58. //$this->testTest();
  59. //$this->activity();
  60. //$this->testBookSmartPushStats();
  61. //$this->sendOrderStats105();
  62. $this->you2();
  63. }
  64. public function activity()
  65. {
  66. $res = \App\Modules\Activity\Services\ActivityService::ActivityStatsI(16);
  67. $str = "日期,site id,活动页面访问uv,按钮uv,生成订单数,成功支付订单数,首充用户数,点击阅读页面文字链uv,阅读页面文字链订单数,阅读页面文字链成功订单数,阅读页面文字链首充用户数,签到回调文字链uv,签到回调文字链生成订单数,签到回调文字链成功成功订单数,签到回调文字链首充用户数\r\n";
  68. $str = mb_convert_encoding($str, 'gbk');
  69. $file_name = date('Y-m-d') . '.csv';
  70. file_put_contents($file_name, $str);
  71. $temp = '';
  72. foreach ($res as $val) {
  73. $temp .= "{$val['day']},{$val['siteid']},{$val['uv']},{$val['button_uv']},{$val['order_num']},{$val['success_order_num']},{$val['first_charge_num']},{$val['reader_uv']},{$val['reader_order']},{$val['reader_success_order']},{$val['reader_first_charge']},{$val['signcallback_uv']},{$val['signcallback_order']},{$val['signcallback_success_order']},{$val['signcallback_first_charge']}\r\n";
  74. }
  75. file_put_contents($file_name, $temp, FILE_APPEND);
  76. }
  77. public function data1(){
  78. //1,图书uv
  79. $keys = Redis::SMEMBERS('book_before_five_uvs');
  80. if(!$keys){
  81. return 0;
  82. }
  83. $data = [];
  84. $book_name_arr = [];
  85. $i = 0;
  86. foreach ($keys as $k){
  87. $k_array = explode('_',$k);
  88. $uv = Redis::scard('book_before_five_uv_'.$k);
  89. if(isset($book_name_arr[$k_array[1]]) && !empty($book_name_arr[$k_array[1]])){
  90. $book_name = $book_name_arr[$k_array[1]];
  91. }else{
  92. $book_name_info = DB::table('book_configs')->where('bid',$k_array[1])->select('book_name')->first();
  93. if($book_name_info){
  94. $book_name_arr[$k_array[1]] = $book_name_info->book_name;
  95. $book_name = $book_name_info->book_name;
  96. }else{
  97. $book_name = '未知';
  98. }
  99. }
  100. $data[] = [
  101. 'bid'=>$k_array[1],
  102. 'day'=>$k_array[0],
  103. 'sequence'=>$k_array[2],
  104. 'book_name'=>$book_name,
  105. 'uv'=>$uv,
  106. 'created_at'=>date('Y-m-d H:i:s'),
  107. 'updated_at'=>date('Y-m-d H:i:s')
  108. ];
  109. $i++;
  110. if($i && $i%200 == 0){
  111. DB::table('book_five_chapter_uv')->insert($data);
  112. $data = [];
  113. }
  114. }
  115. DB::table('book_five_chapter_uv')->insert($data);
  116. }
  117. public function data2(){
  118. //强关
  119. $keys = Redis::SMEMBERS('subscribe_page_uv_send_order_ids');
  120. $data = [];
  121. $i = 0;
  122. foreach ($keys as $k){
  123. $subscribe_uv = Redis::scard('subscribe_page_uv'.$k);
  124. $data[] = [
  125. 'send_order_id'=>$k,
  126. 'subscribe_uv'=>$subscribe_uv,
  127. 'pay_uv'=>0,
  128. 'created_at'=>date('Y-m-d H:i:s'),
  129. 'updated_at'=>date('Y-m-d H:i:s')
  130. ];
  131. $i++;
  132. if($i && $i%200 == 0){
  133. DB::table('subscribe_pay_page_uv')->insert($data);
  134. $data = [];
  135. }
  136. }
  137. $keys = null;
  138. $k = null;
  139. DB::table('subscribe_pay_page_uv')->insert($data);
  140. $data = [];
  141. //支付
  142. $keys = Redis::SMEMBERS('pay_page_uv_send_order_ids');
  143. foreach ($keys as $v){
  144. $pay_uv = Redis::scard('pay_page_uv'.$v);
  145. $o = DB::table('subscribe_pay_page_uv')->where('send_order_id',$v)->first();
  146. if($o){
  147. DB::table('subscribe_pay_page_uv')->where('send_order_id',$v)->update([
  148. 'pay_uv'=>$pay_uv
  149. ]);
  150. }else{
  151. DB::table('subscribe_pay_page_uv')->insert([
  152. 'send_order_id'=>$v,
  153. 'subscribe_uv'=>0,
  154. 'pay_uv'=>$pay_uv,
  155. 'created_at'=>date('Y-m-d H:i:s'),
  156. 'updated_at'=>date('Y-m-d H:i:s')
  157. ]);
  158. }
  159. }
  160. }
  161. public function testTest(){
  162. $res = \App\Modules\Statistic\Services\WapVisitStatService::smartPushTestBookStats(6);
  163. echo \Hashids::encode(6).PHP_EOL;
  164. print_r($res);
  165. }
  166. private function testBookSmartPushStats(){
  167. $sql1 = 'TRUNCATE test_book_smart_push_stats';
  168. DB::update($sql1);
  169. $result = DB::table('book_configs')->whereIn('test_status',[1,2])->select('bid','vip_seq')->get();
  170. /*foreach ($result as $v){
  171. t($v->bid,$v->vip_seq);
  172. }*/
  173. function t($bid,$vip_seq){
  174. $data = [];
  175. $key1 = 'smartPushTestBookPayPageUv:bid:%s';
  176. $pay_page_uv = (int)(Redis::scard(sprintf($key1,$bid)));
  177. $key2 = 'smartPushTestBookPaidUv:bid:%s';
  178. $paid_num = (int)(Redis::scard(sprintf($key2,$bid)));
  179. $amount = Redis::Hget('smartPushTestBookPaidAmount',$bid);
  180. if(!$amount)
  181. $amount = 0;
  182. for ($i = 1;$i<=60;$i++){
  183. $key3 = 'smartPushTestBookChapterUv:bid:%s:seq:%s';
  184. $sequence_uv = (int)(Redis::scard(sprintf($key3,$bid,$i)));
  185. if(!$sequence_uv){
  186. continue;
  187. }
  188. $data[] = [
  189. 'bid'=>$bid,
  190. 'sequence'=>$i,
  191. 'sequence_uv'=>$sequence_uv,
  192. 'vip_sequence'=>$vip_seq,
  193. 'pay_page_uv'=>$pay_page_uv,
  194. 'paid_user_num'=>$paid_num,
  195. 'amount'=>$amount,
  196. 'created_at'=>date('Y-m-d H:i:s'),
  197. 'updated_at'=>date('Y-m-d H:i:s')
  198. ];
  199. }
  200. if($data){
  201. DB::table('test_book_smart_push_stats')->insert($data);
  202. }
  203. }
  204. foreach ($result as $v){
  205. t($v->bid,$v->vip_seq);
  206. }
  207. }
  208. private function sendOrderStats105(){
  209. $sql1 = 'TRUNCATE send_order_stats_105';
  210. DB::update($sql1);
  211. $send_order_ids = Redis::hgetall('sendOrderIdToBid');
  212. if(!$send_order_ids){
  213. return ;
  214. }
  215. function one(int $sendOrderId,int $time){
  216. $info = SendOrderService::getById($sendOrderId);
  217. if(!$info || !$info->book_id){
  218. return ;
  219. }
  220. $subscribe_chaper_seq = 0;
  221. if($info && $info->subscribe_chapter_seq){
  222. $subscribe_chaper_seq = $info->subscribe_chapter_seq;
  223. }
  224. if(!$subscribe_chaper_seq){
  225. $subscribe = BookSubscribleChapterService::getSubcribleChapter($info->book_id,$info->distribution_channel_id);
  226. if ($subscribe) {
  227. $subscribe_chaper_seq = (isset($subscribe->subscribe_chapter_id) && $subscribe->subscribe_chapter_id > 0) ? $subscribe->subscribe_chapter_id : 0;
  228. }
  229. }
  230. $key_1 = 'accurateSendOrderSubscribePageUv:bid:%s:sendorderid:'.$sendOrderId;
  231. //强关页面uv
  232. $subscribe_uv = (int)(Redis::scard(sprintf($key_1,$info->book_id)));
  233. $key_2 = 'accurateSendOrderPayPageUv:bid:%s:send_order_id:'.$sendOrderId;
  234. //付费页面UV
  235. $pay_page_uv = (int)(Redis::scard(sprintf($key_2,$info->book_id)));
  236. //强关数
  237. $subscribe_num = DB::table('force_subscribe_users')
  238. ->where('send_order_id',$sendOrderId)
  239. ->where('bid',$info->book_id)
  240. ->where('created_at','>=',date('Y-m-d H:i:s',$time))
  241. ->count();
  242. $paid_user_num = DB::table('orders')
  243. ->where('send_order_id',$sendOrderId)
  244. ->where('from_bid',$info->book_id)
  245. ->where('status','PAID')
  246. ->where('created_at','>=',date('Y-m-d H:i:s',$time))
  247. ->count();
  248. $book_info = DB::table('book_configs')->where('bid',$info->book_id)->select('book_name','force_subscribe_chapter_seq','vip_seq')->first();
  249. $send_order_chapter_sequence_info = DB::table('chapters')->where('id',$info->chapter_id)->select('sequence')->first();
  250. $send_order_chapter_sequence = 0;
  251. if($send_order_chapter_sequence_info && $send_order_chapter_sequence_info->sequence){
  252. $send_order_chapter_sequence = $send_order_chapter_sequence_info->sequence;
  253. }
  254. if(!$subscribe_chaper_seq){
  255. $subscribe_chaper_seq = $book_info->force_subscribe_chapter_seq;
  256. }
  257. $vip_seq = 0;
  258. $vip_seq_info = Chapter::where('bid',$info->book_id)->where('is_vip',1)->orderBy('sequence')->select('sequence')->first();
  259. if($vip_seq_info){
  260. $vip_seq = $vip_seq_info->sequence;
  261. }
  262. $data = [];
  263. for ($i = 1;$i<=30;$i++){
  264. $key_3 = 'accurateSendOrderChapterUv:bid:%s:seq:%s:sendorderid:'.$sendOrderId;
  265. $chapter_seq_uv = (int)(Redis::scard(sprintf($key_3,$info->book_id,$i)));
  266. if(!$chapter_seq_uv){
  267. continue;
  268. }
  269. $data[] = [
  270. 'send_order_id'=>$sendOrderId,
  271. 'send_order_chapter_seq'=>$send_order_chapter_sequence,
  272. 'bid'=>$info->book_id,
  273. 'book_name'=>$book_info->book_name,
  274. 'chaper_sequence'=>$i,
  275. 'chapter_uv'=>$chapter_seq_uv,
  276. 'subscribe_chaper_seq'=>$subscribe_chaper_seq,
  277. 'subscribe_page_uv'=>$subscribe_uv,
  278. 'subscribe_user_num'=>$subscribe_num,
  279. 'vip_chapter_sequence'=>$vip_seq,
  280. 'pay_page_uv'=>$pay_page_uv,
  281. 'paid_user_num'=>$paid_user_num,
  282. 'created_at'=>date('Y-m-d H:i:s'),
  283. 'updated_at'=>date('Y-m-d H:i:s')
  284. ];
  285. }
  286. if($data){
  287. DB::table('send_order_stats_105')->insert($data);
  288. }
  289. }
  290. foreach ($send_order_ids as $send_order_id=> $v){
  291. $array = explode('-',$v);
  292. if(count($array) == 2){
  293. one($send_order_id,$array[1]);
  294. }
  295. }
  296. }
  297. private function you2(){
  298. $sql1 = 'TRUNCATE yq_stats2';
  299. DB::update($sql1);
  300. $info = BookUser::where('type','ENABLE')->select('bid','uid','type','updated_at')
  301. ->orderBy('updated_at')->limit(1500)->get();
  302. $info2 = BookUser::where('type','GROUP_1')
  303. ->select('bid','uid','type','updated_at')->orderBy('updated_at')->limit(1500)->get();
  304. $this->you2Type($info,'GROUP_2');
  305. $this->you2Type($info2,'GROUP_1');
  306. }
  307. private function you2Type($info,$type){
  308. $result = [];
  309. $chapter_model = new ChapterOrder();
  310. foreach ($info as $item){
  311. $to_bids = YqUserBidRelation::where('uid',$item->uid)->where('to_bid','>',0)->whereColumn('to_bid','!=','from_bid')->select('to_bid','created_at')->get();
  312. $from_bids = YqUserBidRelation::where('uid',$item->uid)->where('from_bid','>',0)->whereColumn('to_bid','!=','from_bid')->select('from_bid','created_at')->get();
  313. $chapter_model->setCurrentTable($item->uid);
  314. if($to_bids){
  315. foreach ($to_bids as $v){
  316. $to_bid = $v->to_bid;
  317. $time = $v->created_at->format('Y-m-d H:i:s');
  318. if(!$to_bid) continue;
  319. $fee = $chapter_model->where('uid',$item->uid)
  320. ->where('bid',$to_bid)
  321. ->where('created_at','>=',$time)
  322. ->sum('fee');
  323. $amount = Order::where('uid',$item->uid)
  324. ->where('from_bid',$to_bid)
  325. ->where('created_at','>=',$time)
  326. ->where('status','PAID')
  327. ->sum('price');
  328. $result[] = [
  329. 'bid'=>$to_bid,
  330. 'uid'=>$item->uid,
  331. 'fee'=>$fee,
  332. 'amount'=>$amount,
  333. 'start_time'=>$time,
  334. 'type'=>'to',
  335. 'group'=>$type,
  336. 'created_at'=>date('Y-m-d H:i:s'),
  337. 'updated_at'=>date('Y-m-d H:i:s')
  338. ];
  339. }
  340. if($result){
  341. DB::table('yq_stats2')->insert($result);
  342. $result = [];
  343. }
  344. }
  345. $to_bid = null;
  346. if($from_bids){
  347. foreach ($from_bids as $from_bid){
  348. $bid = $from_bid->from_bid;
  349. $test = YqZsyTestService::getByBid($bid);
  350. if($test) continue;
  351. $time = $from_bid->created_at->format('Y-m-d H:i:s');
  352. $fee = $chapter_model->where('uid',$item->uid)
  353. ->where('bid',$bid)
  354. ->where('created_at','>=',$time)
  355. ->sum('fee');
  356. $amount = Order::where('uid',$item->uid)
  357. ->where('from_bid',$bid)
  358. ->where('created_at','>=',$time)
  359. ->where('status','PAID')
  360. ->sum('price');
  361. $result[] = [
  362. 'bid'=>$bid,
  363. 'uid'=>$item->uid,
  364. 'fee'=>$fee,
  365. 'amount'=>$amount,
  366. 'start_time'=>$time,
  367. 'type'=>'from',
  368. 'group'=>$type,
  369. 'created_at'=>date('Y-m-d H:i:s'),
  370. 'updated_at'=>date('Y-m-d H:i:s')
  371. ];
  372. }
  373. if($result){
  374. DB::table('yq_stats2')->insert($result);
  375. $result = [];
  376. }
  377. }
  378. }
  379. }
  380. }