SendOrderStat.php 14 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279
  1. <?php
  2. /**
  3. * Created by PhpStorm.
  4. * User: hp
  5. * Date: 2017/11/23
  6. * Time: 19:36
  7. */
  8. namespace App\Modules\SendOrder\Models;
  9. use App\Modules\Book\Models\BookConfig;
  10. use DB;
  11. use Illuminate\Database\Eloquent\Model;
  12. class SendOrderStat extends Model
  13. {
  14. protected $table = 'send_orders_stats';
  15. protected $fillable = ['send_order_id', 'book_name', 'bid', 'recharge_amount', 'uv', 'pv', 'paid_num', 'unpaid_num', 'distribution_channel_id', 'recharge_amount_in_half_day',
  16. 'recharge_amount_in_two_weeks', 'send_time', 'cost', 'year_recharge_user_num', 'ticket_recharge_user_num', 'first_recharge_amount', 'first_recharge_user_num',
  17. 'year_paid_num', 'year_unpaid_num', 'pay_user_num', 'force_user_num', 'register_user_num', 'distribution_channel_name', 'name', 'charge_type', 'create_time', 'recharge_amount_in_one_day', 'recharge_amount_in_three_days'];
  18. //获取派单obj
  19. static function search($params = [])
  20. {
  21. $order_field = 'distribution_channel_id';
  22. $order_type = isset($params['order_type']) ? $params['order_type'] : 'asc';
  23. if (isset($params['order_field']) && $params['order_field']) {
  24. switch ($params['order_field']) {
  25. case 1:
  26. $order_field = 'recharge_amount_in_half_day';
  27. break;
  28. case 2:
  29. $order_field = 'recharge_amount_in_two_weeks';
  30. break;
  31. case 3:
  32. $order_field = 'recharge_amount';
  33. break;
  34. case 4:
  35. $order_field = 'first_recharge_amount';
  36. break;
  37. }
  38. }
  39. $search_obj = self::orderBy($order_field, $order_type);
  40. if (isset($params['start_time']) && $params['start_time']) $search_obj->where('send_time', '>=', $params['start_time']);
  41. if (isset($params['end_time']) && $params['end_time']) $search_obj->where('send_time', '<=', $params['end_time']);
  42. if (isset($params['send_order_id']) && $params['send_order_id']) $search_obj->where('send_order_id', '=', $params['send_order_id']);
  43. if (isset($params['bid']) && $params['bid']) $search_obj->where('bid', '=', $params['bid']);
  44. if (isset($params['name']) && $params['name']) $search_obj->where('name', 'like', "%" . $params['name'] . "%");
  45. if (isset($params['book_name']) && $params['book_name']) $search_obj->where('book_name', '=', $params['book_name']);
  46. if (isset($params['distribution_channel_id']) && $params['distribution_channel_id']) $search_obj->where('distribution_channel_id', '=', $params['distribution_channel_id']);
  47. if (isset($params['distribution_channel_ids']) && $params['distribution_channel_ids']) $search_obj->whereIn('distribution_channel_id', $params['distribution_channel_ids']);
  48. if (isset($params['order_status']) && $params['order_status']) {
  49. if ($params['order_status'] == 1) $search_obj->where('force_user_num', '<', 20);
  50. if ($params['order_status'] == 2) $search_obj->where('force_user_num', '>=', 20);
  51. }
  52. $search_obj->select(
  53. DB::raw('sum(cost) cost'),
  54. DB::raw('sum(recharge_amount_in_three_days) chargeAmountIn72hours'),
  55. DB::raw('sum(pv) clickNum'),
  56. DB::raw('sum(pay_user_num) pay_user_num'),
  57. DB::raw('sum(force_user_num) fansNum'),
  58. DB::raw('sum(first_recharge_user_num) first_recharge_user_num'),
  59. DB::raw('sum(register_user_num) register_num'));
  60. \Log::info($search_obj->toSql());
  61. return $search_obj->get();
  62. }
  63. static function generateStat($data)
  64. {
  65. $conditions = [
  66. 'send_order_id' => $data['send_order_id']
  67. ];
  68. unset($data['send_order_id']);
  69. return self::updateOrCreate($conditions, $data);
  70. }
  71. //获取派单
  72. static function getList($params = [], $is_all = false)
  73. {
  74. $order_type = isset($params['order_type']) ? $params['order_type'] : 'desc';
  75. if (isset($params['order_field']) && $params['order_field']) {
  76. switch ($params['order_field']) {
  77. case 1:
  78. $order_field = 'recharge_amount_in_one_day';
  79. break;
  80. case 2:
  81. $order_field = 'recharge_amount_in_three_days';
  82. break;
  83. case 3:
  84. $order_field = 'recharge_amount';
  85. break;
  86. case 4:
  87. $order_field = 'first_recharge_amount';
  88. break;
  89. case 5:
  90. $order_field = 'uv';
  91. break;
  92. case 6:
  93. $order_field = 'register_user_num';
  94. break;
  95. }
  96. } else {
  97. $order_field = 'create_time';
  98. }
  99. $search_obj = self::orderBy($order_field, $order_type);
  100. if (isset($params['gender']) && $params['gender']) {
  101. $search_obj->join('books','books.id','=','send_orders_stats.bid')
  102. ->join('book_categories','book_categories.id','=','books.category_id')
  103. ->where('book_categories.pid', '=', $params['gender']);
  104. }
  105. if (isset($params['start_time']) && $params['start_time']) $search_obj->where('send_time', '>=', $params['start_time']);
  106. if (isset($params['end_time']) && $params['end_time']) $search_obj->where('send_time', '<=', $params['end_time']);
  107. if (isset($params['send_order_id']) && $params['send_order_id']) $search_obj->where('send_order_id', '=', $params['send_order_id']);
  108. if (isset($params['bid']) && $params['bid']) $search_obj->where('bid', '=', $params['bid']);
  109. if (isset($params['name']) && $params['name']) $search_obj->where('name', 'like', "%" . $params['name'] . "%");
  110. if (isset($params['book_name']) && $params['book_name']) $search_obj->where('book_name', 'like', '%'.$params['book_name'].'%');
  111. if (isset($params['distribution_channel_id']) && $params['distribution_channel_id']) $search_obj->where('distribution_channel_id', '=', $params['distribution_channel_id']);
  112. if (isset($params['order_status']) && $params['order_status']) {
  113. if ($params['order_status'] == 1) $search_obj->where('force_user_num', '<', 20);
  114. if ($params['order_status'] == 2) $search_obj->where('force_user_num', '>=', 20);
  115. }
  116. //\Log::info($search_obj->toSql());
  117. if ($is_all) {
  118. return $search_obj->get();
  119. } else {
  120. return $search_obj->paginate();
  121. }
  122. }
  123. //获取派单obj
  124. static function getObj($params = [])
  125. {
  126. $order_type = isset($params['order_type']) ? $params['order_type'] : 'desc';
  127. if (isset($params['order_field']) && $params['order_field']) {
  128. switch ($params['order_field']) {
  129. case 1:
  130. $order_field = 'recharge_amount_in_half_day';
  131. break;
  132. case 2:
  133. $order_field = 'recharge_amount_in_two_weeks';
  134. break;
  135. case 3:
  136. $order_field = 'recharge_amount';
  137. break;
  138. case 4:
  139. $order_field = 'first_recharge_amount';
  140. break;
  141. }
  142. } else {
  143. $order_field = 'create_time';
  144. }
  145. $search_obj = self::orderBy($order_field, $order_type);
  146. if (isset($params['start_time']) && $params['start_time']) $search_obj->where('create_time', '>=', $params['start_time']);
  147. if (isset($params['end_time']) && $params['end_time']) $search_obj->where('create_time', '<=', $params['end_time']);
  148. if (isset($params['send_order_id']) && $params['send_order_id']) $search_obj->where('send_order_id', '=', $params['send_order_id']);
  149. if (isset($params['bid']) && $params['bid']) $search_obj->where('bid', '=', $params['bid']);
  150. if (isset($params['name']) && $params['name']) $search_obj->where('name', 'like', "%" . $params['name'] . "%");
  151. if (isset($params['book_name']) && $params['book_name']) $search_obj->where('book_name', '=', $params['book_name']);
  152. if (isset($params['distribution_channel_id']) && $params['distribution_channel_id']) $search_obj->where('distribution_channel_id', '=', $params['distribution_channel_id']);
  153. if (isset($params['order_status']) && $params['order_status']) {
  154. if ($params['order_status'] == 1) $search_obj->where('force_user_num', '<', 20);
  155. if ($params['order_status'] == 2) $search_obj->where('force_user_num', '>=', 20);
  156. }
  157. return $search_obj;
  158. }
  159. static function getRechargeAmountByBookId($params = [], $is_out_side = true, $is_24_hour = true)
  160. {
  161. $search_obj = self::orderBy('create_time');
  162. if (isset($params['book_id']) && $params['book_id']) $search_obj->where('bid', $params['book_id']);
  163. if (isset($params['end_time']) && $params['end_time']) $search_obj->where('send_time', '<=', $params['end_time']);
  164. if (isset($params['start_time']) && $params['start_time']) $search_obj->where('send_time', '>=', $params['start_time']);
  165. if ($is_out_side) {
  166. $search_obj->where('register_user_num', '>=', 20);
  167. } else {
  168. $search_obj->where('register_user_num', '<', 20);
  169. }
  170. if ($is_24_hour) {
  171. $search_obj->select('recharge_amount_in_one_day');
  172. return $search_obj->sum('recharge_amount_in_one_day');
  173. } else {
  174. $search_obj->select('recharge_amount_in_three_days');
  175. return $search_obj->sum('recharge_amount_in_three_days');
  176. }
  177. }
  178. public static function getBookSendOrdersRechargeStats($channels) {
  179. // self::
  180. $sum_stats = self::select(DB::raw('count(id) as send_orders_num,
  181. sum(recharge_amount) as recharge_amount_sum,
  182. sum(paid_num) as paid_num_sum,
  183. sum(unpaid_num) as unpaid_num_sum,
  184. sum(pay_user_num) as pay_user_num_sum,
  185. bid')
  186. )
  187. //->where('date',date('Y-m-d'))
  188. ->whereIn('distribution_channel_id',$channels)
  189. ->whereNotNull('bid')
  190. ->groupBy('bid')
  191. ->orderBy('recharge_amount_sum','desc')
  192. ->paginate();
  193. $channels_str = implode(',',$channels);
  194. //\Log::info('sum_stats_origin:'.json_encode($sum_stats));
  195. foreach ($sum_stats as $sum_stat) {
  196. $yesterday_recharge = DB::select("select book_name,sum(recharge_amount) as yesterday_recharge
  197. from send_orders_force_day_stats where distribution_channel_id in ($channels_str) and bid =".($sum_stat->bid)." and date='".date('Y-m-d',strtotime('-1 day'))."'");
  198. $yesterday_recharge_sum = $yesterday_recharge[0]->yesterday_recharge;
  199. $book_name = $yesterday_recharge[0]->book_name;
  200. if(empty($book_name)){
  201. $book = BookConfig::where('bid',$sum_stat->bid)->first();
  202. if($book){
  203. $book_name = $book->book_name;
  204. }
  205. }
  206. $sum_stat->yesterday_recharge = $yesterday_recharge_sum;
  207. $sum_stat->book_name = $book_name;
  208. $sum_stat->order_total = intval($sum_stat->paid_num_sum) + intval($sum_stat->unpaid_num_sum);
  209. $sum_stat->average_recharge = $sum_stat->pay_user_num_sum >0?round($sum_stat->recharge_amount_sum/$sum_stat->pay_user_num_sum,2):0;
  210. $sum_stat->success_rate = $sum_stat->order_total>0?(round($sum_stat->paid_num_sum/$sum_stat->order_total,2)*100).'%':0;
  211. }
  212. //\Log::info('sum_stats:'.json_encode($sum_stats));
  213. return $sum_stats;
  214. }
  215. /**
  216. * @param $channels
  217. * @return array
  218. */
  219. public static function exportBookSendOrdersRechargeStats($channels){
  220. \Log::info($channels);
  221. $channels_str = implode(',',$channels);
  222. $sum_stats = DB::select("select book_name,count(id) as send_orders_num,
  223. sum(recharge_amount) as recharge_amount_sum,
  224. sum(paid_num) as paid_num_sum,
  225. sum(unpaid_num) as unpaid_num_sum,
  226. sum(pay_user_num) as pay_user_num_sum,
  227. bid from send_orders_stats where distribution_channel_id in ($channels_str)
  228. group by bid"
  229. );
  230. $sum_stats = json_decode(json_encode($sum_stats),true);
  231. $yesterday = date('Y-m-d',strtotime('-1 day'));
  232. $sum_day_stats = DB::select("select bid,sum(recharge_amount) as yesterday_recharge from send_orders_force_day_stats
  233. where date='{$yesterday}' and distribution_channel_id in ($channels_str) group by bid
  234. ");
  235. $sum_day_stats = json_decode(json_encode($sum_day_stats),true);
  236. $sum_stats_day_temp = [];
  237. /*foreach ($sum_stats as $sum_stat){
  238. $sum_stats_total[$sum_stats->bid] = $sum_stat;
  239. }*/
  240. foreach ($sum_day_stats as $sum_day_stat){
  241. $sum_stats_day_temp[$sum_day_stat['bid']] = $sum_day_stat;
  242. }
  243. $data = array();
  244. $header = ['书名','派单数','充值总额','充值人数','人均充值','昨日充值','成功订单数','订单总数','订单成功率'];
  245. foreach ($sum_stats as $key=>$value){
  246. $yesterday_recharge = array_key_exists($value['bid'],$sum_stats_day_temp)?$sum_stats_day_temp[$value['bid']]['yesterday_recharge']:0;
  247. $order_num = $value['paid_num_sum']+$value['unpaid_num_sum'];
  248. $data[] = [
  249. $value['book_name'],$value['send_orders_num'],
  250. $value['recharge_amount_sum'],$value['pay_user_num_sum'],
  251. $value['pay_user_num_sum']>0?round($value['recharge_amount_sum']/$value['pay_user_num_sum'],2):0,
  252. $yesterday_recharge, $value['paid_num_sum'], $order_num,
  253. $order_num>0?round($value['paid_num_sum']/$order_num,2):0
  254. ];
  255. }
  256. return ['header'=>$header,'data'=>$data];
  257. }
  258. }