SendOrderStat.php 11 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229
  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. static function generateStat($data)
  19. {
  20. $conditions = [
  21. 'send_order_id' => $data['send_order_id']
  22. ];
  23. unset($data['send_order_id']);
  24. return self::updateOrCreate($conditions, $data);
  25. }
  26. //获取派单
  27. static function getList($params = [], $is_all = false)
  28. {
  29. $order_type = isset($params['order_type']) ? $params['order_type'] : 'desc';
  30. if (isset($params['order_field']) && $params['order_field']) {
  31. switch ($params['order_field']) {
  32. case 1:
  33. $order_field = 'recharge_amount_in_one_day';
  34. break;
  35. case 2:
  36. $order_field = 'recharge_amount_in_three_days';
  37. break;
  38. case 3:
  39. $order_field = 'recharge_amount';
  40. break;
  41. case 4:
  42. $order_field = 'first_recharge_amount';
  43. break;
  44. case 5:
  45. $order_field = 'uv';
  46. break;
  47. case 6:
  48. $order_field = 'register_user_num';
  49. break;
  50. }
  51. } else {
  52. $order_field = 'create_time';
  53. }
  54. $search_obj = self::orderBy($order_field, $order_type);
  55. if (isset($params['gender']) && $params['gender']) {
  56. $search_obj->join('books','books.id','=','send_orders_stats.bid')
  57. ->join('book_categories','book_categories.id','=','books.category_id')
  58. ->where('book_categories.pid', '=', $params['gender']);
  59. }
  60. if (isset($params['start_time']) && $params['start_time']) $search_obj->where('send_time', '>=', $params['start_time']);
  61. if (isset($params['end_time']) && $params['end_time']) $search_obj->where('send_time', '<=', $params['end_time']);
  62. if (isset($params['send_order_id']) && $params['send_order_id']) $search_obj->where('send_order_id', '=', $params['send_order_id']);
  63. if (isset($params['bid']) && $params['bid']) $search_obj->where('bid', '=', $params['bid']);
  64. if (isset($params['name']) && $params['name']) $search_obj->where('name', 'like', "%" . $params['name'] . "%");
  65. if (isset($params['book_name']) && $params['book_name']) $search_obj->where('book_name', 'like', '%'.$params['book_name'].'%');
  66. if (isset($params['distribution_channel_id']) && $params['distribution_channel_id']) $search_obj->where('distribution_channel_id', '=', $params['distribution_channel_id']);
  67. if (isset($params['order_status']) && $params['order_status']) {
  68. if ($params['order_status'] == 1) $search_obj->where('force_user_num', '<', 20);
  69. if ($params['order_status'] == 2) $search_obj->where('force_user_num', '>=', 20);
  70. }
  71. //\Log::info($search_obj->toSql());
  72. if ($is_all) {
  73. return $search_obj->get();
  74. } else {
  75. return $search_obj->paginate();
  76. }
  77. }
  78. //获取派单obj
  79. static function getObj($params = [])
  80. {
  81. $order_type = isset($params['order_type']) ? $params['order_type'] : 'desc';
  82. if (isset($params['order_field']) && $params['order_field']) {
  83. switch ($params['order_field']) {
  84. case 1:
  85. $order_field = 'recharge_amount_in_half_day';
  86. break;
  87. case 2:
  88. $order_field = 'recharge_amount_in_two_weeks';
  89. break;
  90. case 3:
  91. $order_field = 'recharge_amount';
  92. break;
  93. case 4:
  94. $order_field = 'first_recharge_amount';
  95. break;
  96. }
  97. } else {
  98. $order_field = 'create_time';
  99. }
  100. $search_obj = self::orderBy($order_field, $order_type);
  101. if (isset($params['start_time']) && $params['start_time']) $search_obj->where('create_time', '>=', $params['start_time']);
  102. if (isset($params['end_time']) && $params['end_time']) $search_obj->where('create_time', '<=', $params['end_time']);
  103. if (isset($params['send_order_id']) && $params['send_order_id']) $search_obj->where('send_order_id', '=', $params['send_order_id']);
  104. if (isset($params['bid']) && $params['bid']) $search_obj->where('bid', '=', $params['bid']);
  105. if (isset($params['name']) && $params['name']) $search_obj->where('name', 'like', "%" . $params['name'] . "%");
  106. if (isset($params['book_name']) && $params['book_name']) $search_obj->where('book_name', '=', $params['book_name']);
  107. if (isset($params['distribution_channel_id']) && $params['distribution_channel_id']) $search_obj->where('distribution_channel_id', '=', $params['distribution_channel_id']);
  108. if (isset($params['order_status']) && $params['order_status']) {
  109. if ($params['order_status'] == 1) $search_obj->where('force_user_num', '<', 20);
  110. if ($params['order_status'] == 2) $search_obj->where('force_user_num', '>=', 20);
  111. }
  112. return $search_obj;
  113. }
  114. static function getRechargeAmountByBookId($params = [], $is_out_side = true, $is_24_hour = true)
  115. {
  116. $search_obj = self::orderBy('create_time');
  117. if (isset($params['book_id']) && $params['book_id']) $search_obj->where('bid', $params['book_id']);
  118. if (isset($params['end_time']) && $params['end_time']) $search_obj->where('send_time', '<=', $params['end_time']);
  119. if (isset($params['start_time']) && $params['start_time']) $search_obj->where('send_time', '>=', $params['start_time']);
  120. if ($is_out_side) {
  121. $search_obj->where('register_user_num', '>=', 20);
  122. } else {
  123. $search_obj->where('register_user_num', '<', 20);
  124. }
  125. if ($is_24_hour) {
  126. $search_obj->select('recharge_amount_in_one_day');
  127. return $search_obj->sum('recharge_amount_in_one_day');
  128. } else {
  129. $search_obj->select('recharge_amount_in_three_days');
  130. return $search_obj->sum('recharge_amount_in_three_days');
  131. }
  132. }
  133. public static function getBookSendOrdersRechargeStats($channels) {
  134. // self::
  135. $sum_stats = self::select(DB::raw('count(id) as send_orders_num,
  136. sum(recharge_amount) as recharge_amount_sum,
  137. sum(paid_num) as paid_num_sum,
  138. sum(unpaid_num) as unpaid_num_sum,
  139. sum(pay_user_num) as pay_user_num_sum,
  140. bid')
  141. )
  142. //->where('date',date('Y-m-d'))
  143. ->whereIn('distribution_channel_id',$channels)
  144. ->whereNotNull('bid')
  145. ->groupBy('bid')
  146. ->orderBy('recharge_amount_sum','desc')
  147. ->paginate();
  148. $channels_str = implode(',',$channels);
  149. //\Log::info('sum_stats_origin:'.json_encode($sum_stats));
  150. foreach ($sum_stats as $sum_stat) {
  151. $yesterday_recharge = DB::select("select book_name,sum(recharge_amount) as yesterday_recharge
  152. 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'))."'");
  153. $yesterday_recharge_sum = $yesterday_recharge[0]->yesterday_recharge;
  154. $book_name = $yesterday_recharge[0]->book_name;
  155. if(empty($book_name)){
  156. $book = BookConfig::where('bid',$sum_stat->bid)->first();
  157. if($book){
  158. $book_name = $book->book_name;
  159. }
  160. }
  161. $sum_stat->yesterday_recharge = $yesterday_recharge_sum;
  162. $sum_stat->book_name = $book_name;
  163. $sum_stat->order_total = intval($sum_stat->paid_num_sum) + intval($sum_stat->unpaid_num_sum);
  164. $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;
  165. $sum_stat->success_rate = $sum_stat->order_total>0?(round($sum_stat->paid_num_sum/$sum_stat->order_total,2)*100).'%':0;
  166. }
  167. //\Log::info('sum_stats:'.json_encode($sum_stats));
  168. return $sum_stats;
  169. }
  170. /**
  171. * @param $channels
  172. * @return array
  173. */
  174. public static function exportBookSendOrdersRechargeStats($channels){
  175. \Log::info($channels);
  176. $channels_str = implode(',',$channels);
  177. $sum_stats = DB::select("select book_name,count(id) as send_orders_num,
  178. sum(recharge_amount) as recharge_amount_sum,
  179. sum(paid_num) as paid_num_sum,
  180. sum(unpaid_num) as unpaid_num_sum,
  181. sum(pay_user_num) as pay_user_num_sum,
  182. bid from send_orders_stats where distribution_channel_id in ($channels_str)
  183. group by bid"
  184. );
  185. $sum_stats = json_decode(json_encode($sum_stats),true);
  186. $yesterday = date('Y-m-d',strtotime('-1 day'));
  187. $sum_day_stats = DB::select("select bid,sum(recharge_amount) as yesterday_recharge from send_orders_force_day_stats
  188. where date='{$yesterday}' and distribution_channel_id in ($channels_str) group by bid
  189. ");
  190. $sum_day_stats = json_decode(json_encode($sum_day_stats),true);
  191. $sum_stats_day_temp = [];
  192. /*foreach ($sum_stats as $sum_stat){
  193. $sum_stats_total[$sum_stats->bid] = $sum_stat;
  194. }*/
  195. foreach ($sum_day_stats as $sum_day_stat){
  196. $sum_stats_day_temp[$sum_day_stat['bid']] = $sum_day_stat;
  197. }
  198. $data = array();
  199. $header = ['书名','派单数','充值总额','充值人数','人均充值','昨日充值','成功订单数','订单总数','订单成功率'];
  200. foreach ($sum_stats as $key=>$value){
  201. $yesterday_recharge = array_key_exists($value['bid'],$sum_stats_day_temp)?$sum_stats_day_temp[$value['bid']]['yesterday_recharge']:0;
  202. $order_num = $value['paid_num_sum']+$value['unpaid_num_sum'];
  203. $data[] = [
  204. $value['book_name'],$value['send_orders_num'],
  205. $value['recharge_amount_sum'],$value['pay_user_num_sum'],
  206. $value['pay_user_num_sum']>0?round($value['recharge_amount_sum']/$value['pay_user_num_sum'],2):0,
  207. $yesterday_recharge, $value['paid_num_sum'], $order_num,
  208. $order_num>0?round($value['paid_num_sum']/$order_num,2):0
  209. ];
  210. }
  211. return ['header'=>$header,'data'=>$data];
  212. }
  213. }