SuperiorHistoryBookService.php 20 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387
  1. <?php
  2. /**
  3. * Created by PhpStorm.
  4. * User: tandunzhao
  5. * Date: 2017/12/4
  6. * Time: 下午1:43
  7. */
  8. namespace App\Modules\Book\Services;
  9. use App\Modules\Book\Models\BadBookInfo;
  10. use App\Modules\Book\Models\SuperiorHistoryBooks;
  11. use App\Modules\Book\Models\SuperiorHistoryBooksLevel;
  12. use App\Modules\Book\Models\SuperiorNewBooks;
  13. use DB;
  14. class SuperiorHistoryBookService
  15. {
  16. public static function getSendOrderStats(){
  17. $res = DB::select("select * from (select t.*,book_categories.pid,book_configs.recommend_index,books.category_id from (select bid,book_name,sum(uv) UV,
  18. sum(register_user_num) register_user_sum,sum(recharge_amount) recharge_sum,sum(force_user_num) force_user_sum,sum(pay_user_num) pay_user_num
  19. from send_orders_stats group by
  20. bid ) as t,books,book_categories,book_configs where books.id = t.bid and book_configs.bid=t.bid and book_categories.id = books.category_id) tmp where tmp.UV >=2500 and
  21. not exists(select id from superior_history_book shb where shb.bid=tmp.bid)");
  22. $activities = DB::table('activity')
  23. ->select('id','start_time','end_time')
  24. ->where('customer_msg','<>','')
  25. ->get();
  26. //var_dump($res);
  27. foreach ($res as $item) {
  28. $temp = array(
  29. 'bid'=>$item->bid,
  30. 'UV'=>$item->UV,
  31. 'register_user_sum'=>$item->register_user_sum,
  32. 'pay_user_num'=>$item->pay_user_num,
  33. 'recharge_sum'=>$item->recharge_sum,
  34. 'force_user_sum'=>$item->force_user_sum,
  35. 'pid'=>$item->pid,
  36. 'category_id'=>$item->category_id,
  37. 'recommend_index'=>$item->recommend_index
  38. );
  39. $year_paid = DB::select("select count(distinct t.uid) as year_recharge_user_num,sum(t.fee) year_recharge_sum from year_orders t
  40. where t.send_order_id in (select s.send_order_id from send_orders_stats s where s.bid={$item->bid})");
  41. //var_dump($year_paid);
  42. $temp['pay_user_num'] -= $year_paid[0]->year_recharge_user_num;
  43. $temp['recharge_sum'] -= $year_paid[0]->year_recharge_sum;
  44. foreach ($activities as $key=>$value) {
  45. $filter = DB::table('send_orders_force_day_stats')
  46. ->select(DB::raw('sum(uv) as UV,sum(pay_user_num) as pay_user_num,sum(register_user_num) register_user_sum,sum(recharge_amount) recharge_sum,sum(force_user_num) force_user_sum'))
  47. ->where([
  48. ['date','>=',date('Y-m-d',strtotime($value->start_time))],
  49. ['date','<=',date('Y-m-d',strtotime(($value->end_time).' -1 minute +3 day'))],
  50. ['bid','=',$item->bid],
  51. ])
  52. ->first();
  53. $temp['UV'] -= $filter->UV;
  54. $temp['register_user_sum'] -= $filter->register_user_sum;
  55. $temp['recharge_sum'] -= $filter->recharge_sum;
  56. $temp['force_user_sum'] -= $filter->force_user_sum;
  57. $temp['pay_user_num'] -= $filter->pay_user_num;
  58. //echo date('Y-m-d',strtotime($value->start_time)).'--'.date('Y-m-d',strtotime(($value->end_time).' -1 minute +3 day'));
  59. }
  60. //var_dump($temp);
  61. //if($item->pid==2){
  62. self::addHistorySuperiorItem($temp);
  63. //}
  64. }
  65. }
  66. public static function addHistorySuperiorItem($param) {
  67. $uv = $param['UV'];
  68. $register_uv_rate = $param['UV']>0?round($param['register_user_sum']/$param['UV'],4)*100:0;
  69. $force_sub_rate = $param['register_user_sum']>0?round($param['force_user_sum']/$param['register_user_sum'],4)*100:0;
  70. $pay_force_sub_rate = $param['force_user_sum']>0?round($param['pay_user_num']/$param['force_user_sum'],4)*100:0;
  71. $pay_uv_rate = $param['UV']>0?round($param['pay_user_num']/$param['UV'],4)*100:0;
  72. $charge_uv_rate = $param['UV']>0?round($param['recharge_sum']/$param['UV'],2):0;
  73. $sign = array('bid'=>$param['bid']);
  74. $data = array(
  75. //'bid'=>$param['bid'],
  76. 'category_id'=>$param['category_id'],
  77. 'pid'=>$param['pid'],
  78. 'status'=>1,
  79. 'recommend_index'=>$param['recommend_index'],
  80. 'uv'=>$uv,
  81. 'register_uv_rate'=>$register_uv_rate,
  82. 'force_sub_rate'=>$force_sub_rate,
  83. 'pay_uv_rate'=>$pay_uv_rate,
  84. 'pay_force_sub_rate'=>$pay_force_sub_rate,
  85. 'charge_uv_rate'=>$charge_uv_rate,
  86. 'updated_at'=>date('Y-m-d H:i:s')
  87. );
  88. if($param['pid']==2 && $uv>=5000) {
  89. if($register_uv_rate>=85){
  90. if(($force_sub_rate>=40 && $pay_force_sub_rate>=10)||$pay_uv_rate>=4){
  91. $data['level'] = 1;
  92. SuperiorHistoryBooks::updateOrCreate($sign,$data);
  93. }
  94. }elseif($register_uv_rate>=30 && $register_uv_rate<85){
  95. if($pay_uv_rate>=3.6){
  96. $data['level'] = 2;
  97. SuperiorHistoryBooks::updateOrCreate($sign,$data);
  98. }
  99. }elseif($register_uv_rate<30 && $charge_uv_rate>=1) {
  100. $data['level'] = 3;
  101. SuperiorHistoryBooks::updateOrCreate($sign,$data);
  102. }
  103. }
  104. if($param['pid']==1){
  105. if($pay_uv_rate>1.5 && $register_uv_rate>=25) {
  106. $data['level'] = 1;
  107. SuperiorHistoryBooks::updateOrCreate($sign,$data);
  108. }elseif($pay_uv_rate>1 &&$pay_uv_rate<1.5 && $register_uv_rate>=20) {
  109. $data['level'] = 2;
  110. SuperiorHistoryBooks::updateOrCreate($sign,$data);
  111. }elseif($pay_uv_rate<1 && $charge_uv_rate>=0.1) {
  112. $data['level'] = 3;
  113. SuperiorHistoryBooks::updateOrCreate($sign,$data);
  114. }
  115. }
  116. }
  117. public static function getSuperiorList($pid='',$page_size=15,$search=[],$paginate=true){
  118. return SuperiorHistoryBooks::getSuperiorList($pid,$page_size,$paginate,$search);
  119. }
  120. public static function getSupriorBidList(){
  121. $books = SuperiorHistoryBooks::getSuperiorList('','',false);
  122. $res = [];
  123. foreach ($books as $book){
  124. $res[] = $book->bid;
  125. }
  126. return $res;
  127. }
  128. public static function deleteOne($bid){
  129. return SuperiorHistoryBooks::where('bid',$bid)->update(['status'=>0]);
  130. }
  131. public static function setTop($bid){
  132. $item = SuperiorHistoryBooks::where('bid',$bid)->first();
  133. $max = SuperiorHistoryBooks::select(DB::raw('max(order_index) as max_index'))
  134. ->where('pid',$item->pid)
  135. ->first();
  136. //var_dump($max);
  137. $max_index = intval($max->max_index)+1;
  138. $item->order_index = $max_index;
  139. $item->save();
  140. }
  141. public static function selectHistoryBooks() {
  142. //$to_do = array('tmp.register_uv_rate>=0.85','tmp.register_uv_rate>=0.3 and tmp.register_uv_rate<0.85','tmp.register_uv_rate<0.3');
  143. $to_do = array('tmp.register_uv_rate>=0.85','tmp.register_uv_rate<0.3');
  144. foreach ($to_do as $key=>$value){
  145. $level = ++$key;
  146. $res = DB::select("select * from (select t.*,book_categories.pid,book_configs.recommend_index,books.category_id from (SELECT tmp.bid,tmp.book_name,tmp.charge_type,sum(tmp.uv) UV,
  147. sum(tmp.register_user_num) register_user_sum,
  148. sum(tmp.recharge_amount) recharge_sum,
  149. sum(tmp.force_user_num) force_user_sum,
  150. sum(tmp.pay_user_num) pay_user_num,
  151. SUM(tmp.uv_one_day) AS uv_one_day_sum,
  152. SUM(tmp.uv_three_day) AS uv_three_day_sum,
  153. SUM(tmp.recharge_amount_in_one_day)-SUM(tmp.one_day_year_recharge) AS recharge_amount_in_one_day_sum,
  154. SUM(tmp.recharge_amount_in_three_days)-SUM(tmp.three_day_year_recharge) AS recharge_amount_in_three_days
  155. FROM (
  156. select s.bid,s.book_name,book_configs.charge_type,s.uv,s.register_user_num,s.recharge_amount,send_order_extra_stats.uv_one_day,send_order_extra_stats.uv_three_day,
  157. IFNULL((SELECT sum(price) FROM orders WHERE orders.send_order_id=s.send_order_id AND orders.`status`='PAID' AND orders.order_type='YEAR' AND orders.created_at > s.send_time AND UNIX_TIMESTAMP(orders.created_at)<=(UNIX_TIMESTAMP(s.send_time)+84600)),0) AS one_day_year_recharge,
  158. IFNULL((SELECT sum(price) FROM orders WHERE orders.send_order_id=s.send_order_id AND orders.`status`='PAID' AND orders.order_type='YEAR' AND orders.created_at > s.send_time AND UNIX_TIMESTAMP(orders.created_at)<=(UNIX_TIMESTAMP(s.send_time)+259200)),0) AS three_day_year_recharge,
  159. s.recharge_amount_in_one_day,s.recharge_amount_in_three_days,s.year_paid_num,
  160. s.force_user_num,s.pay_user_num,s.register_user_num/s.uv as register_uv_rate,s.force_user_num/s.register_user_num as force_sub_rate
  161. from send_orders_stats as s JOIN send_order_extra_stats ON send_order_extra_stats.send_order_id=s.send_order_id
  162. join book_configs on book_configs.bid=s.bid where book_configs.is_on_shelf in (1,2) and s.send_time between '".date('Y-m-d',strtotime('-34 day'))."' and '".date('Y-m-d 23:59:59',strtotime('-4 day'))."' and s.uv >= 100
  163. ) tmp
  164. WHERE $value and tmp.force_sub_rate <= 0.65 GROUP BY tmp.bid) as t,books,book_categories,book_configs where books.id = t.bid and book_configs.bid=t.bid and book_categories.id = books.category_id and book_categories.pid=2) tmp2 where tmp2.uv_one_day_sum >=1000
  165. and not exists(select 1 from superior_history_book shb where shb.bid=tmp2.bid and shb.status=1)
  166. ");//and not exists(select id from superior_history_level shb where shb.bid=tmp2.bid and shb.level=$level)
  167. foreach ($res as $item) {
  168. $temp = array(
  169. 'bid'=>$item->bid,
  170. 'UV'=>$item->UV,
  171. 'charge_type'=>$item->charge_type,
  172. 'register_user_sum'=>$item->register_user_sum,
  173. 'pay_user_num'=>$item->pay_user_num,
  174. 'recharge_sum'=>$item->recharge_sum,
  175. 'force_user_sum'=>$item->force_user_sum,
  176. 'pid'=>$item->pid,
  177. 'category_id'=>$item->category_id,
  178. 'recommend_index'=>$item->recommend_index,
  179. 'recharge_amount_in_one_day'=>$item->recharge_amount_in_one_day_sum,
  180. 'recharge_amount_in_three_days'=>$item->recharge_amount_in_three_days,
  181. 'uv_one_day_sum'=>$item->uv_one_day_sum,
  182. 'uv_three_day_sum'=>$item->uv_three_day_sum
  183. );
  184. self::judgeHistoryBook($level,$temp);
  185. }
  186. }
  187. }
  188. public static function judgeHistoryBook($level,$param){
  189. $uv = $param['UV'];
  190. $register_uv_rate = $param['UV']>0?round($param['register_user_sum']/$param['UV'],4)*100:0;
  191. $force_sub_rate = $param['register_user_sum']>0?round($param['force_user_sum']/$param['register_user_sum'],4)*100:0;
  192. $pay_force_sub_rate = $param['force_user_sum']>0?round($param['pay_user_num']/$param['force_user_sum'],4)*100:0;
  193. $pay_uv_rate = $param['UV']>0?round($param['pay_user_num']/$param['UV'],4)*100:0;
  194. $charge_uv_rate = $param['UV']>0?round($param['recharge_sum']/$param['UV'],2):0;
  195. $one_day_recharge_uv_rate = $param['uv_one_day_sum']>0?round($param['recharge_amount_in_one_day']/$param['uv_one_day_sum'],2):0;
  196. $three_days_recharge_uv_rate = $param['uv_three_day_sum']>0?round($param['recharge_amount_in_three_days']/$param['uv_three_day_sum'],2):0;
  197. $three_days_recharge_one_day_uv = $param['uv_one_day_sum']>0?round( $param['recharge_amount_in_three_days']/ $param['uv_one_day_sum'],2):0;
  198. $sign = array('bid'=>$param['bid']);
  199. $data = array(
  200. //'bid'=>$param['bid'],
  201. 'category_id'=>$param['category_id'],
  202. 'pid'=>$param['pid'],
  203. 'status'=>1,
  204. 'recommend_index'=>$param['recommend_index'],
  205. 'uv'=>$uv,
  206. 'register_uv_rate'=>$register_uv_rate,
  207. 'force_sub_rate'=>$force_sub_rate,
  208. 'pay_uv_rate'=>$pay_uv_rate,
  209. 'pay_force_sub_rate'=>$pay_force_sub_rate,
  210. 'charge_uv_rate'=>$charge_uv_rate,
  211. 'updated_at'=>date('Y-m-d H:i:s'),
  212. 'one_day_recharge_uv_rate'=>$one_day_recharge_uv_rate,
  213. 'three_days_recharge_uv_rate'=>$three_days_recharge_uv_rate
  214. //'three_days_recharge_one_day_uv'=>$three_days_recharge_one_day_uv
  215. );
  216. $flag_level = [
  217. 'bid'=>$param['bid'],
  218. 'level'=>$level
  219. ];
  220. $data_level = [
  221. 'uv'=>$uv,
  222. 'register_uv_rate'=>$register_uv_rate,
  223. 'force_sub_rate'=>$force_sub_rate,
  224. 'pay_uv_rate'=>$pay_uv_rate,
  225. 'pay_force_sub_rate'=>$pay_force_sub_rate,
  226. 'charge_uv_rate'=>$charge_uv_rate,
  227. 'one_day_recharge_uv_rate'=>$one_day_recharge_uv_rate,
  228. 'three_days_recharge_uv_rate'=>$three_days_recharge_uv_rate
  229. //'three_days_recharge_one_day_uv'=>$three_days_recharge_one_day_uv
  230. ];
  231. $max_sequence = self::getMaxSequence();
  232. $data['order_index'] = 1+$max_sequence;
  233. //if($param['pid']==2 && $uv>=5000) {
  234. if($register_uv_rate>=85){
  235. //if(($force_sub_rate>=40 && $pay_force_sub_rate>=10)||$pay_uv_rate>=4){
  236. if(($param['charge_type']=='BOOK' && $one_day_recharge_uv_rate>=1)||($param['charge_type']=='CHAPTER' && $one_day_recharge_uv_rate>=0.8)){
  237. $data['level'] = 1;
  238. SuperiorHistoryBooks::updateOrCreate($sign,$data);
  239. SuperiorHistoryBooksLevel::updateOrCreate($flag_level,$data_level);
  240. }
  241. }elseif($register_uv_rate<=30) {
  242. //if(($param['charge_type']=='BOOK' && $one_day_recharge_uv_rate>=0.85)||($param['charge_type']=='CHAPTER' && $three_days_recharge_uv_rate>=1)){
  243. if(($param['charge_type']=='BOOK' && $one_day_recharge_uv_rate>=0.85)||($param['charge_type']=='CHAPTER' && $three_days_recharge_one_day_uv>=1.15)){
  244. $data['level'] = 3;
  245. SuperiorHistoryBooks::updateOrCreate($sign,$data);
  246. SuperiorHistoryBooksLevel::updateOrCreate($flag_level,$data_level);
  247. }
  248. }
  249. //}
  250. if($param['pid']==1){
  251. //if($pay_uv_rate>0.5) {
  252. $data['level'] = 1;
  253. SuperiorHistoryBooks::updateOrCreate($sign,$data);
  254. SuperiorHistoryBooksLevel::updateOrCreate($flag_level,$data_level);
  255. //}
  256. }
  257. }
  258. public static function selectMaleSuperiorBooks(){
  259. /*$res = DB::select("SELECT s.*,book_categories.pid,book_configs.recommend_index,books.category_id FROM (SELECT tmp.bid,tmp.book_name,sum(tmp.uv) UV,
  260. sum(tmp.register_user_num) register_user_sum,
  261. sum(tmp.recharge_amount) recharge_sum,
  262. sum(tmp.force_user_num) force_user_sum,
  263. sum(tmp.pay_user_num) pay_user_sum
  264. FROM send_orders_stats tmp
  265. WHERE tmp.uv>1500 GROUP BY tmp.bid) as s,books,book_categories,book_configs where books.id = s.bid and book_configs.bid=s.bid and book_categories.id = books.category_id and book_categories.pid=1 AND s.recharge_sum/s.UV > 0.5 and
  266. not exists(select id from superior_history_level shb where shb.bid=tmp2.bid)");*/
  267. $res = DB::select("SELECT s.*,book_categories.pid,book_configs.recommend_index,books.category_id FROM (SELECT tmp.bid,tmp.book_name,sum(tmp.uv) UV,
  268. sum(tmp.register_user_num) register_user_sum,
  269. sum(tmp.recharge_amount) recharge_sum,
  270. sum(tmp.force_user_num) force_user_sum,
  271. sum(tmp.pay_user_num) pay_user_num
  272. FROM send_orders_stats tmp where tmp.bid in (1969,1998,758,2115,872,1894,642,1890,2032,635,1163,1174,1166,1893,693,680,2066,1165,1896,1048,842,2064,1897,1891,770,816,971,694,829,2120) GROUP BY tmp.bid) as s,books,book_categories,book_configs where books.id = s.bid and book_configs.bid=s.bid and book_categories.id = books.category_id and book_categories.pid=1 and
  273. not exists(select id from superior_history_level shb where shb.bid=s.bid)");
  274. foreach ($res as $item) {
  275. $temp = array(
  276. 'bid'=>$item->bid,
  277. 'UV'=>$item->UV,
  278. 'register_user_sum'=>$item->register_user_sum,
  279. 'pay_user_num'=>$item->pay_user_num,
  280. 'recharge_sum'=>$item->recharge_sum,
  281. 'force_user_sum'=>$item->force_user_sum,
  282. 'pid'=>$item->pid,
  283. 'category_id'=>$item->category_id,
  284. 'recommend_index'=>$item->recommend_index
  285. );
  286. /*$year_paid = DB::select("select count(distinct t.uid) as year_recharge_user_num,sum(t.fee) year_recharge_sum from year_orders t
  287. where t.send_order_id in (select s.send_order_id from send_orders_stats s where s.bid={$item->bid})");
  288. $temp['pay_user_num'] -= $year_paid[0]->year_recharge_user_num;
  289. $temp['recharge_sum'] -= $year_paid[0]->year_recharge_sum;*/
  290. self::judgeHistoryBook(1,$temp);
  291. }
  292. }
  293. public static function updateOne($bid,$param) {
  294. return SuperiorHistoryBooks::where('bid',$bid)->update($param);
  295. }
  296. public static function adjustSequence($bid,$sequence) {
  297. $total = SuperiorHistoryBooks::where('status',1)->count();
  298. if($sequence <1 || $sequence>$total){
  299. throw new \Exception('sequence offset!',10001);
  300. }
  301. $pres = SuperiorHistoryBooks::where([
  302. //['order_index','<',$sequence],
  303. ['superior_history_book.status','=',1],
  304. ['superior_history_book.bid','<>',$bid]
  305. ])
  306. ->whereExists(function ($query) {
  307. $query->select(DB::raw(1))
  308. ->from('book_configs')
  309. ->whereRaw('book_configs.bid = superior_history_book.bid')
  310. ->whereBetween('is_on_shelf',[1,2]);
  311. })
  312. ->select(['superior_history_book.id','superior_history_book.bid','superior_history_book.register_uv_rate','superior_history_book.pay_uv_rate','superior_history_book.charge_uv_rate','superior_history_book.pid','superior_history_book.created_at'])
  313. ->orderBy('superior_history_book.order_index','asc')
  314. ->orderBy('superior_history_book.recommend_index','desc')
  315. ->orderBy('superior_history_book.id','asc')
  316. ->get();
  317. //self::sortBooks($pres,1); //对序号之前的书重新排序
  318. $current_book = SuperiorHistoryBooks::where('bid',$bid)->first();
  319. $current_book->order_index = $sequence;
  320. $current_book->save(); //把当前书插入$sequence序号
  321. /*$post = SuperiorHistoryBooks::where([
  322. ['order_index','>=',$sequence],
  323. ['superior_history_book.status','=',1],
  324. ['superior_history_book.bid','<>',$bid]
  325. ])
  326. ->whereExists(function ($query) {
  327. $query->select(DB::raw(1))
  328. ->from('book_configs')
  329. ->whereRaw('book_configs.bid = superior_history_book.bid')
  330. ->whereBetween('is_on_shelf',[1,2]);
  331. })
  332. ->select(['superior_history_book.id','superior_history_book.bid','superior_history_book.register_uv_rate','superior_history_book.pay_uv_rate','superior_history_book.charge_uv_rate','superior_history_book.pid','superior_history_book.created_at'])
  333. ->orderBy('superior_history_book.order_index','asc')
  334. ->orderBy('superior_history_book.recommend_index','desc')
  335. ->orderBy('superior_history_book.id','asc')
  336. ->get();*/
  337. self::sortBooks($pres,$sequence);//后面的书重新排序
  338. }
  339. private static function sortBooks($datas,$sequence){
  340. foreach ($datas as $key=>$data) {
  341. if($key+1 < $sequence){
  342. $data->order_index = $key+1;
  343. $data->save();
  344. }else{
  345. $data->order_index = $key+2;
  346. $data->save();
  347. }
  348. }
  349. }
  350. public static function getMaxSequence() {
  351. return SuperiorHistoryBooks::join('book_configs','book_configs.bid','=','superior_history_book.bid')
  352. ->where('superior_history_book.status',1)
  353. ->whereBetween('book_configs.is_on_shelf',[1,2])
  354. ->max('superior_history_book.order_index');
  355. }
  356. public static function resortSuperiorBooks() {
  357. $list = SuperiorHistoryBooks::getSuperiorList('','',false);
  358. foreach ($list as $key=>$item) {
  359. $item->order_index = $key+1;
  360. $item->save();
  361. }
  362. }
  363. }