BookTest.php 13 KB

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