OrderService.php 12 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292
  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. $list = self::getOrderQuerySql($param)->select("orders.*",'orders_refund_verify.id as refund_id', 'pay_merchants.name as pay_merchant_name', 'pay_merchants.payee_name', 'pay_merchants.pay_appid', 'miniprogram.play_name', "miniprogram.name as xcx_name", 'promotions.name as promotion_title')->orderBy("orders.id", 'desc');
  25. if ($isAll) {
  26. $list = $list->get();
  27. } else {
  28. $list = $list->paginate(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 = $val->puser_id > 0 ? DB::table('users')->where('id', $val->puser_id)->value("username") : "-";
  36. $val->total_count = Order::where('uid', $val->uid)->where('id', "<=", $val->id)->count();
  37. if ($val->user_id > 0) {
  38. $val->caompany_count = Order::where('uid', $val->uid)->where('status','<>', 'UNPAID')->where('puser_id', '>', 0)->where('puser_id', $val->puser_id)->where('id', "<=", $val->id)->count();
  39. $val->promotion_count = Order::where('uid', $val->uid)->where('status','<>', 'UNPAID')->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();
  40. } else {
  41. $val->caompany_count = Order::where('uid', $val->uid)->where('status','<>', 'UNPAID')->where('puser_id', '>', 0)->count();
  42. $val->promotion_count = Order::where('uid', $val->uid)->where('status','<>', 'UNPAID')->where('user_id', '>', 0)->count();
  43. }
  44. $val->pay_appid = $val->pay_appid ?: '-';
  45. $val->pay_merchant_name = $val->pay_merchant_name ?: '-';
  46. $val->payee_name = $val->payee_name ?: '-';
  47. $val->xcx_name = $val->xcx_name ?: '-';
  48. $val->play_name = $val->play_name ?: '-';
  49. $val->promotion_title = $val->promotion_title ?: '-';
  50. $val->tip_text = $types[$val->order_type]['name'] ?? "-";
  51. $val->status_txt = $status[$val->status]['name'] ?? "-";
  52. $val->can_apply = $val->refund_id < 1 && $val->status == 'PAID';
  53. $val->pay_name = '微信支付';
  54. unset($val->refund_id);
  55. }
  56. }
  57. return $list;
  58. }
  59. /**
  60. * 充值类型
  61. * name: getOrderType
  62. * @return \string[][]
  63. * date 2023/06/02 09:56
  64. */
  65. public static function getOrderType()
  66. {
  67. return [
  68. ["value" => "COIN", "name" => "普通充值"],
  69. ["value" => 'MONTH', "name" => '包月'],
  70. ["value" => 'QUARTER', "name" => '包季'],
  71. ["value" => 'YEAR', "name" => '包年'],
  72. ["value" => "FIRST_COIN", "name" => "首充"]
  73. ];
  74. }
  75. /**
  76. * 订单状态
  77. * name: getOrderPayType
  78. * @return \string[][]
  79. * date 2023/06/02 09:57
  80. */
  81. public static function getOrderPayType()
  82. {
  83. return [
  84. ["value" => "PAID", "name" => "已支付"],
  85. ["value" => 'REFUND', "name" => '已退款'],
  86. ["value" => 'UNPAID', "name" => '未支付'],
  87. ];
  88. }
  89. private static function getOrderQuerySql(array $param)
  90. {
  91. $sql = DB::table('orders')->leftJoin('orders_refund_verify','orders.id','=','orders_refund_verify.order_id')->leftJoin('miniprogram', 'miniprogram.id', '=', 'orders.miniprogram_id')->leftJoin('promotions', 'promotions.id', '=', 'orders.promotion_id')->leftJoin('pay_merchants', 'pay_merchants.id', '=', 'orders.pay_merchant_id');
  92. // 优化师查询
  93. if (!empty(getProp($param, 'user_id'))) {
  94. $sql->where('orders.user_id', $param['user_id']);
  95. }
  96. // 公司查询
  97. if (!empty(getProp($param, 'puser_id'))) {
  98. $sql->where('orders.puser_id', $param['puser_id']);
  99. }
  100. // 小程序
  101. if (!empty(getProp($param, 'miniprogram_id'))) {
  102. $sql->where('orders.miniprogram_id', $param['miniprogram_id']);
  103. }
  104. // 推广id
  105. if (!empty(getProp($param, 'promotion_id'))) {
  106. $sql->where('orders.promotion_id', $param['promotion_id']);
  107. }
  108. // 订单状态查询
  109. if (!empty(getProp($param, 'status'))) {
  110. $sql->where('orders.status', $param['status']);
  111. }
  112. // 充值项类型
  113. if (!empty(getProp($param, 'order_type'))) {
  114. $sql->where('orders.order_type', $param['order_type']);
  115. }
  116. // 用户
  117. if (!empty(getProp($param, 'uid'))) {
  118. $sql->where('orders.uid', $param['uid']);
  119. }
  120. // 订单号查询
  121. if (!empty(getProp($param, 'trade_no'))) {
  122. $sql->where('orders.trade_no', "like", "%" . $param['trade_no'] . "%");
  123. // $sql->where('orders.trade_no', $param['trade_no']);
  124. }
  125. if (!empty(getProp($param, 'trade_no'))) {
  126. // $sql->where('orders.trade_no', "like", "%" . $param['trade_no'] . "%");
  127. $sql->where('orders.trade_no', $param['trade_no']);
  128. }
  129. // 支付时间
  130. if (!empty(getProp($param, 'pay_end_at_start'))) {
  131. $sql->where('orders.pay_end_at', ">=", $param['pay_end_at_start']);
  132. }
  133. if (!empty(getProp($param, 'pay_end_at_end'))) {
  134. $end = $param['pay_end_at_end'];
  135. if ($end == getProp($param, 'pay_end_at_start', '')) {
  136. $end = date("Y-m-d", strtotime($end)) . " 23:59:59";
  137. }
  138. $sql->where('orders.pay_end_at', "<=", $end);
  139. }
  140. // 创建时间
  141. if (!empty(getProp($param, 'created_at_start'))) {
  142. $sql->where('orders.created_at', '>=', $param['created_at_start']);
  143. }
  144. if (!empty(getProp($param, 'created_at_end'))) {
  145. $end = $param['created_at_end'];
  146. if ($end == getProp($param, 'created_at_start', '')) {
  147. $end = date("Y-m-d", strtotime($end)) . " 23:59:59";
  148. }
  149. $sql->where('orders.created_at', "<=", $end);
  150. }
  151. // 支付配置信息查询
  152. if (getProp($param, 'pay_merchant_name', '')) {
  153. // 支付名称
  154. $sql->where("pay_merchants.name", $param['pay_merchant_name']);
  155. }
  156. if (getProp($param, 'payee_name', '')) {
  157. // 收款主体
  158. $sql->where("pay_merchants.payee_name", "like", "%" . $param['payee_name'] . "%");
  159. }
  160. if (getProp($param, 'pay_appid', '')) {
  161. // 商户号
  162. $sql->where("pay_merchants.pay_appid", $param['pay_appid']);
  163. }
  164. return $sql;
  165. }
  166. /**
  167. * 用户订单小程选择列表
  168. * name: userUseProgramsList
  169. * @param mixed $uid
  170. * @return \Illuminate\Database\Eloquent\Builder[]|\Illuminate\Database\Eloquent\Collection|\Illuminate\Support\Collection
  171. * date 2023/05/23 17:51
  172. */
  173. public static function userUseProgramsList(mixed $uid, $name = "", $limit = 20)
  174. {
  175. $operateUser = User::find($uid);
  176. $operateUserRoles = $operateUser->roles->pluck('identify');
  177. if ($operateUserRoles->contains('company') || $operateUserRoles->contains('optimizer')) {
  178. $list = UserHasMiniprograms::query()->join('miniprogram', 'miniprogram.id', '=', 'user_has_miniprograms.miniprogram_id')
  179. ->where('uid', $uid)
  180. ->groupBy("user_has_miniprograms.miniprogram_id")
  181. ->select('user_has_miniprograms.miniprogram_id', 'miniprogram.name', 'miniprogram.play_name');
  182. if ($name) {
  183. $list->where('name', "like", "%" . $name . "%");
  184. }
  185. return $list->orderBy('miniprogram.id', 'desc')->limit($limit)->get();
  186. } else {
  187. if ($name) {
  188. return DB::table('miniprogram')->where('name', "like", "%" . $name . "%")->select("id as miniprogram_id", "name", "play_name")->limit($limit)->get();
  189. }
  190. return DB::table('miniprogram')->select("id as miniprogram_id", "name", "play_name")->orderBy('id', 'desc')->limit($limit)->get();
  191. }
  192. }
  193. /**
  194. * 推广列表选择项
  195. * name: promotionsOptions
  196. * @param mixed $uid
  197. * @param mixed $title
  198. * @return \Illuminate\Support\Collection
  199. * date 2023/05/23 18:13
  200. */
  201. public static function promotionsOptions(mixed $uid, mixed $title, mixed $miniprogram_id, mixed $limit = 10)
  202. {
  203. $operateUser = User::find($uid);
  204. $operateUserRoles = $operateUser->roles->pluck('identify');
  205. $list = DB::table('promotions')->select('id as promotion_id', 'name');
  206. if ($operateUserRoles->contains('optimizer')) {
  207. if ($miniprogram_id) {
  208. $list->where('miniprogram_id', $miniprogram_id);
  209. }
  210. if ($title) {
  211. $list->where('name', 'like', "%" . $title . "%");
  212. }
  213. return $list->where('uid', $uid)->orderBy('id', 'desc')->limit($limit)->get();
  214. } else if ($operateUserRoles->contains('company')) {
  215. $list = DB::table('promotions')->join('users', 'users.id', "promotions.uid")
  216. ->where('users.pid', $uid)->orWhere("promotions.uid", $uid)->select('promotions.id as promotion_id', 'promotions.name');
  217. if ($title) {
  218. $list->where('promotions.name', 'like', "%" . $title . "%");
  219. }
  220. if ($miniprogram_id) {
  221. $list->where('promotions.miniprogram_id', $miniprogram_id);
  222. }
  223. return $list->orderBy('promotions.id', 'desc')->limit($limit)->get();
  224. } else {
  225. if ($miniprogram_id) {
  226. $list->where('miniprogram_id', $miniprogram_id);
  227. }
  228. if ($title) {
  229. $list->where('name', 'like', "%" . $title . "%");
  230. }
  231. return $list->orderBy('id', 'desc')->limit($limit)->get();
  232. }
  233. }
  234. /***
  235. * 订单列表优化师选择项
  236. * name: promotionsUsers
  237. * @param mixed $pid
  238. * @param mixed $name
  239. * @param mixed $limit
  240. * date 2023/05/26 09:22
  241. */
  242. public static function promotionsUsers(mixed $pid, mixed $name, mixed $miniprogram_id, mixed $limit = 10)
  243. {
  244. if ($pid > 0) {
  245. $list = DB::table('users')->where('pid', $pid)->select('users.id as user_id', 'users.username as name');
  246. if ($name) {
  247. $list->where('username', 'like', "%" . $name . "%");
  248. }
  249. if ($miniprogram_id > 0) {
  250. $list->join('user_has_miniprograms', 'user_has_miniprograms.uid', 'users.id')
  251. ->where('user_has_miniprograms.miniprogram_id', $miniprogram_id);
  252. }
  253. return $list->orderBy('users.id', 'desc')->limit($limit)->get();
  254. }
  255. $list = DB::table('users')->join('user_has_roles', 'users.id', "user_has_roles.user_id")->join('roles', 'roles.id', 'user_has_roles.role_id')
  256. ->select('users.id as user_id', 'users.username as name')->where('roles.identify', 'optimizer');
  257. if ($miniprogram_id > 0) {
  258. $list->join('user_has_miniprograms', 'user_has_miniprograms.uid', 'users.id')
  259. ->where('user_has_miniprograms.miniprogram_id', $miniprogram_id);
  260. }
  261. if ($name) {
  262. $list->where('users.username', 'like', "%" . $name . "%");
  263. }
  264. return $list->orderBy('users.id', 'desc')->limit($limit)->get();
  265. }
  266. }