OrderService.php 8.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250
  1. <?php
  2. namespace App\Modules\Subscribe\Services;
  3. use App\Modules\Subscribe\Models\Order;
  4. use DB;
  5. class OrderService
  6. {
  7. static function getByTradeNo($trade_no)
  8. {
  9. return Order::where('trade_no',$trade_no)->first();
  10. }
  11. public static function getOrderList($uid,$page_size){
  12. return Order::select('id','price','created_at','status','trade_no')->where('uid',$uid)->where('from_type','!=','order_add')->orderBy('created_at','desc')->paginate($page_size);
  13. }
  14. public static function getSuccessOrderList($uid,$page_size){
  15. return Order::select('id','price','created_at','status','trade_no','order_type')->where('uid',$uid)->where('status','PAID')->where('from_type','!=','order_add')->orderBy('created_at','desc')->paginate($page_size);
  16. }
  17. public static function isUserHasOrder($uid){
  18. return Order::where('uid',$uid)->where('from_type','!=','order_add')->count();
  19. }
  20. public static function getUserLastestOrder($uid)
  21. {
  22. if (empty($uid)) {
  23. return [];
  24. }
  25. $result = Order::where('uid', $uid)->where('status', 'PAID')->orderBy('id')->limit(1)->get();
  26. return $result ? $result->toArray() : [];
  27. }
  28. /**
  29. * 获取充值订单
  30. * @param $uid
  31. * @return mixed
  32. */
  33. public static function totalChargeList($uid){
  34. return Order::join('products','orders.product_id','=','products.id')
  35. ->select('products.price','products.given')
  36. ->where('orders.order_type','RECHARGE')
  37. ->where('orders.status','PAID')
  38. ->where('orders.uid',$uid)
  39. ->get();
  40. }
  41. /**
  42. * 订单生成
  43. */
  44. static function generate($data)
  45. {
  46. //订单号生成
  47. $data['trade_no'] = $data['product_id'].date("YmdHis").hexdec(uniqid());
  48. return Order::create($data);
  49. }
  50. static function save_order($data){
  51. $insert_data = array();
  52. $insert_data['uid'] = $data['uid'];
  53. $insert_data['price'] = $data['price'];
  54. $insert_data['status'] = $data['status'];
  55. $insert_data['pay_type'] = $data['pay_type'];
  56. $insert_data['product_id'] = $data['product_id'];
  57. $insert_data['distribution_channel_id'] = $data['distribution_channel_id'];
  58. $insert_data['trade_no'] = $data['trade_no'];
  59. $insert_data['pay_merchant_source'] = $data['pay_merchant_source'];
  60. $insert_data['pay_merchant_id'] = $data['pay_merchant_id'];
  61. $insert_data['order_type'] = $data['order_type'];
  62. $insert_data['transaction_id'] = $data['transaction_id'];
  63. $insert_data['from_bid'] = $data['from_bid'];
  64. $insert_data['pay_end_at'] = $data['pay_end_at'];
  65. $insert_data['create_ip'] = $data['create_ip'];
  66. $insert_data['send_order_id'] = $data['send_order_id'];
  67. $insert_data['send_order_name'] = isset($data['send_order_name'])?$data['send_order_name']:'';
  68. $insert_data['from_type'] = $data['from_type'];
  69. $insert_data['activity_id'] = $data['activity_id'];
  70. $insert_data['inner_send_order_id'] = isset($data['inner_send_order_id'])?$data['inner_send_order_id']:'';
  71. return $result = Order::save_order($insert_data);
  72. }
  73. /**
  74. * 获取所有分销渠道
  75. * @return mixed
  76. */
  77. static function getAllChannelId(){
  78. return Order::select('distribution_channel_id')->distinct()->get()->toArray();
  79. }
  80. /**
  81. * 获取渠道下最近20条订单记录
  82. * @param $distribution_channel_id
  83. * @param int $num
  84. */
  85. static function getLatestOrderByChannleId($source,$num=20){
  86. return Order::select('orders.id','orders.status','orders.created_at')
  87. ->orderBy('orders.created_at','desc')
  88. ->where('orders.pay_merchant_source',$source)
  89. ->where('orders.created_at','<=',date('Y-m-d H:i:s',time()-10))
  90. ->limit($num)
  91. ->get();
  92. }
  93. /**
  94. * 获取最后一条订单,用于订单预警
  95. * @return mixed
  96. */
  97. public static function getLastOrder(){
  98. return Order::orderBy('created_at','desc')->first();
  99. }
  100. public static function userIsParticipateActivity($uid,$activity_id){
  101. return Order::where('uid',$uid)->where('activity_id',$activity_id)->where('status','PAID')->count();
  102. }
  103. /**
  104. * 渠道公众号重充值统计
  105. */
  106. public static function OfficialAccountOrderStat($distribution_channel_id,$start_time,$end_time,$page_size=15){
  107. return Order::OfficialAccountOrderStat($distribution_channel_id,$start_time,$end_time,$page_size);
  108. }
  109. /**
  110. * 渠道公众号重充值统计
  111. */
  112. public static function OfficialAccountOrderSum($distribution_channel_id,$start_time,$end_time,$appid){
  113. return Order::OfficialAccountOrderSum($distribution_channel_id,$start_time,$end_time,$appid);
  114. }
  115. /**
  116. * 根据派单获取充值总量
  117. * @param int $send_order_id
  118. * @param int $distribution_channel_id
  119. * @return float
  120. */
  121. public static function getSumBySendOrderId(int $send_order_id,int $distribution_channel_id):float {
  122. return (float)Order::where('send_order_id',$send_order_id)
  123. //->where('distribution_channel_id',$distribution_channel_id)
  124. ->whereIn('order_type',['RECHARGE','YEAR'])
  125. ->where('status','PAID')->sum('price');
  126. }
  127. /**
  128. * @param int $send_order_id
  129. * @return array
  130. */
  131. public static function getSuccessRate(int $send_order_id):array {
  132. $sql_format = "select
  133. count(*) as total,count(case when `status`='PAID' then `status` else null end) as success
  134. from orders
  135. WHERE send_order_id = %s and order_type= 'RECHARGE' ";
  136. $sql = sprintf($sql_format,$send_order_id);
  137. $res = DB::select($sql);
  138. $total = $res[0]->total;
  139. $success = $res[0]->success;
  140. return compact('total','success');
  141. }
  142. /**
  143. * 判断用户首充
  144. */
  145. public static function judgeUserFirstRecharge($uid) {
  146. $user_recharge = Order::where([
  147. ['status','=','PAID'],
  148. ['uid','=',$uid]
  149. ])->first();
  150. if(!$user_recharge){
  151. return true;
  152. }
  153. return false;
  154. }
  155. /**
  156. * @param $inner_send_order_id
  157. */
  158. public static function getInnerSendOrderStats($inner_send_order_id){
  159. return Order::where('inner_send_order_id',$inner_send_order_id)
  160. ->select(
  161. DB::raw('count(distinct uid) as pay_user_num'),
  162. DB::raw('sum(price) as charge_amount')
  163. )
  164. ->where('status','PAID')
  165. ->first();
  166. }
  167. public static function getUserOrderByProductId($uid,$product_id){
  168. return Order::where('uid',$uid)->where('product_id',$product_id)->where('status','PAID')->first();
  169. }
  170. /**
  171. * 是否是付费用户
  172. * @param $uid
  173. * @return bool
  174. */
  175. public static function isPaidUser($uid){
  176. if(empty($uid)){
  177. return false;
  178. }
  179. $result = Order::select('id')->where('uid',$uid)->where('status','PAID')->first();
  180. if($result && $result->id){
  181. return true;
  182. }
  183. return false;
  184. }
  185. /**
  186. * 是否是付费用户
  187. * @param $openid
  188. * @return bool
  189. */
  190. public static function isPaidUserByOpenid($openid){
  191. if(empty($openid)){
  192. return false;
  193. }
  194. $result = Order::join('users','users.id','=','orders.uid')
  195. ->select('orders.id')
  196. ->where('users.openid',$openid)
  197. ->where('orders.status','PAID')
  198. ->first();
  199. if($result && $result->id){
  200. return true;
  201. }
  202. return false;
  203. }
  204. public static function getUserChargeTimes($uid){
  205. return Order::getUserChargeTimes($uid);
  206. }
  207. public static function getChargeNum($uid)
  208. {
  209. return Order::where('uid',$uid)->where('status','PAID')->sum('price');
  210. }
  211. public static function isYearOrderUser($uid){
  212. $info = Order::where('uid',$uid)
  213. ->where('status','PAID')
  214. ->where('order_type','YEAR')
  215. ->orderBy('id','desc')
  216. ->select('created_at')
  217. ->first();
  218. if($info && strtotime($info->created_at)+365*86400 >time() ){
  219. return true;
  220. }
  221. return false;
  222. }
  223. }