OrderService.php 7.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206
  1. <?php
  2. /**
  3. *
  4. * @file:OrderService.php
  5. * @Date: 2023/5/23
  6. * @Time: 13:40
  7. */
  8. namespace Modules\Channel\Services\Order;
  9. use Illuminate\Support\Facades\DB;
  10. use Modules\Channel\Models\Order;
  11. use Modules\Channel\Models\UserHasMiniprograms;
  12. use Modules\Manage\Models\Miniprogram;
  13. use Modules\User\Models\User;
  14. class OrderService
  15. {
  16. /**
  17. * 订单列表查询
  18. * name: getOrderList
  19. * @param array $param
  20. * date 2023/05/23 13:45
  21. */
  22. public static function getOrderList(array $param, $isAll = false)
  23. {
  24. $sql = self::getOrderQuerySql($param);
  25. if ($isAll) {
  26. $list = $sql->get();
  27. } else {
  28. $list = $sql->simplePaginate(getProp($param, 'limit', 15));
  29. }
  30. if (!$list->isEmpty()) {
  31. $status = array_column(self::getOrderPayType(),null,'value');
  32. $types = array_column(self::getOrderType(),null,'value');
  33. foreach ($list as $val) {
  34. $val->username = $val->user_id > 0 ? User::where('id', $val->user_id)->value('username') : "";
  35. $val->company_name = "-";
  36. $val->play_name = '-';
  37. $company = Miniprogram::where('id', $val->miniprogram_id)->first();
  38. if ($company) {
  39. $val->company_name = $company->company();
  40. $val->play_name = $company->play_name;
  41. }
  42. $val->promotion_title = $val->promotion_id > 0 ? DB::table('promotions')->where('id', $val->promotion_id)->value('name') : "";
  43. $val->total_count = Order::where('uid', $val->uid)->where('id', "<=", $val->id)->count();
  44. if ($val->user_id > 0) {
  45. $val->caompany_count = Order::where('uid', $val->uid)->where('puser_id', '>', 0)->where('puser_id', $val->puser_id)->where('id', "<=", $val->id)->count();
  46. $val->promotion_count = Order::where('uid', $val->uid)->where('puser_id', '>', 0)->where('puser_id', $val->puser_id)->where('user_id', ">", 0)->where('user_id', $val->user_id)->where('id', "<=", $val->id)->count();
  47. } else {
  48. $val->caompany_count = Order::where('uid', $val->uid)->where('puser_id', '>', 0)->count();
  49. $val->promotion_count = Order::where('uid', $val->uid)->where('user_id', '>', 0)->count();
  50. }
  51. $val->tip_text = $types[$val->order_type]['name']?? "-";
  52. $val->status_txt = $status[$val->status]['name'] ?? "-";
  53. $val->pay_name = '微信支付';
  54. }
  55. }
  56. return $list;
  57. }
  58. public static function getOrderType()
  59. {
  60. return [
  61. ["value" => "COIN","name" => "普通充值"],
  62. ["value" => 'MONTH',"name" => '包月'],
  63. ["value" => 'QUARTER' ,"name"=> '包季'],
  64. ["value" => 'YEAR' ,"name"=> '包年'],
  65. ["value" => "FIRST_COIN" ,"name" => "首冲"]
  66. ];
  67. }
  68. public static function getOrderPayType()
  69. {
  70. return [
  71. ["value" => "PAID","name" => "已支付"],
  72. ["value" =>'REFUND',"name" => '已退款'],
  73. ["value" =>'UNPAID' ,"name"=> '未支付'],
  74. ];
  75. }
  76. private static function getOrderQuerySql(array $param)
  77. {
  78. $sql = Order::query();
  79. // 优化师查询
  80. if (!empty(getProp($param, 'user_id'))) {
  81. $sql->where('user_id', $param['user_id']);
  82. }
  83. // 公司查询
  84. if (!empty(getProp($param, 'puser_id'))) {
  85. $sql->where('puser_id', $param['puser_id']);
  86. }
  87. // 小程序
  88. if (!empty(getProp($param, 'miniprogram_id'))) {
  89. $sql->where('miniprogram_id', $param['miniprogram_id']);
  90. }
  91. // 推广id
  92. if (!empty(getProp($param, 'promotion_id'))) {
  93. $sql->where('promotion_id', $param['promotion_id']);
  94. }
  95. // 订单状态查询
  96. if (!empty(getProp($param, 'status'))) {
  97. $sql->where('status', $param['status']);
  98. }
  99. // 充值项类型
  100. if (!empty(getProp($param, 'order_type'))) {
  101. $sql->where('order_type', $param['order_type']);
  102. }
  103. // 用户
  104. if (!empty(getProp($param, 'uid'))) {
  105. $sql->where('uid', $param['uid']);
  106. }
  107. // 订单号查询
  108. if (!empty(getProp($param, 'trade_no'))) {
  109. $sql->where('trade_no', "like", "%" . $param['trade_no'] . "%");
  110. // $sql->where('trade_no', $param['trade_no']);
  111. }
  112. if (!empty(getProp($param, 'trade_no'))) {
  113. // $sql->where('trade_no', "like", "%" . $param['trade_no'] . "%");
  114. $sql->where('trade_no', $param['trade_no']);
  115. }
  116. // 支付时间
  117. if (!empty(getProp($param, 'pay_end_at_start'))) {
  118. $sql->where('pay_end_at', $param['pay_end_at_start']);
  119. }
  120. if (!empty(getProp($param, 'pay_end_at_end'))) {
  121. $sql->where('pay_end_at', "<=", $param['pay_end_at_end']);
  122. }
  123. // 创建时间
  124. if (!empty(getProp($param, 'created_at_start'))) {
  125. $sql->where('created_at', $param['created_at_start']);
  126. }
  127. if (!empty(getProp($param, 'created_at_end'))) {
  128. $sql->where('created_at', "<=", $param['created_at_end']);
  129. }
  130. return $sql;
  131. }
  132. /**
  133. * 用户订单小程选择列表
  134. * name: userUseProgramsList
  135. * @param mixed $uid
  136. * @return \Illuminate\Database\Eloquent\Builder[]|\Illuminate\Database\Eloquent\Collection|\Illuminate\Support\Collection
  137. * date 2023/05/23 17:51
  138. */
  139. public static function userUseProgramsList(mixed $uid)
  140. {
  141. $operateUser = User::find($uid);
  142. $operateUserRoles = $operateUser->roles->pluck('identify');
  143. if ($operateUserRoles->contains('company') || $operateUserRoles->contains('optimizer')) {
  144. return UserHasMiniprograms::query()->join('miniprogram', 'miniprogram.id', '=', 'user_has_miniprograms.miniprogram_id')
  145. ->where('uid', $uid)
  146. ->groupBy("user_has_miniprograms.miniprogram_id")
  147. ->select('user_has_miniprograms.miniprogram_id', 'miniprogram.name', 'miniprogram.play_name')
  148. ->get();
  149. } else {
  150. return DB::table('miniprogram')->select("id as miniprogram_id", "name", "play_name")->get();
  151. }
  152. }
  153. /**
  154. * 推广列表选择项
  155. * name: promotionsOptions
  156. * @param mixed $uid
  157. * @param mixed $title
  158. * @return \Illuminate\Support\Collection
  159. * date 2023/05/23 18:13
  160. */
  161. public static function promotionsOptions(mixed $uid, mixed $title)
  162. {
  163. $operateUser = User::find($uid);
  164. $operateUserRoles = $operateUser->roles->pluck('identify');
  165. $list = DB::table('promotions')->select('id as promotion_id ', 'name');
  166. if ($operateUserRoles->contains('optimizer')) {
  167. if ($title) {
  168. $list->where('name', 'like', "%" . $title . "%");
  169. }
  170. return $list->where('uid', $uid)->get();
  171. } else if ($operateUserRoles->contains('company')) {
  172. $list = DB::table('promotions')->join('users','users.id',"promotions.uid")
  173. ->where('users.pid',$uid)->orWhere("promotions.uid",$uid)->select("promotions.id as promotion_id ", 'promotions.name');
  174. if ($title) {
  175. $list->where('promotions.name', 'like', "%" . $title . "%");
  176. }
  177. return $list->get();
  178. } else {
  179. if ($title) {
  180. $list->where('name', 'like', "%" . $title . "%");
  181. }
  182. return $list->get();
  183. }
  184. }
  185. }