OrderController.php 10 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269
  1. <?php
  2. namespace Modules\ManageApi\Controllers;
  3. use App\Constants\CommonConstant;
  4. use App\Events\PayTotalEvent;
  5. use App\Models\OrderModel;
  6. use App\Models\PayTotalModel;
  7. use App\Repositories\OrderRepository;
  8. use Illuminate\Support\Carbon;
  9. class OrderController extends BaseController
  10. {
  11. public function lists()
  12. {
  13. $inputData = $this->getJsonData();
  14. $rules = [
  15. 'page' => 'required|integer',
  16. 'page_size' => 'required|integer',
  17. 'order_sn' => 'nullable|string',
  18. 'merchant_uid' => 'nullable|string',
  19. 'status' => 'nullable|in:1,2'
  20. ];
  21. $validator = app('validator')->make($inputData, $rules);
  22. if ($validator->fails()) {
  23. // 如果有错误(可能是多个信息),这里只取第一个错误信息返回.
  24. return json_fail($validator->errors()->first());
  25. }
  26. $pageSize = $inputData['page_size'] ?? CommonConstant::PAGE_SIZE;
  27. if ($pageSize > 500) {
  28. $pageSize = CommonConstant::PAGE_SIZE;
  29. }
  30. $page = format_page($inputData['page'] ?? 0);
  31. $model = OrderModel::query();
  32. if (!empty($inputData['status'])) {
  33. $model = $model->where('status', $inputData['status']);
  34. }
  35. if (!empty($inputData['order_sn'])) {
  36. $model = $model->where('order_sn', $inputData['order_sn']);
  37. }
  38. if (!empty($inputData['merchant_order_sn'])) {
  39. $model = $model->where('merchant_order_sn', $inputData['merchant_order_sn']);
  40. }
  41. if (!empty($inputData['merchant_uid'])) {
  42. $model = $model->where('merchant_uid', $inputData['merchant_uid']);
  43. }
  44. if (!empty($inputData['start_date']) && !empty($inputData['end_date'])) {
  45. $model = $model->whereBetween('created_at', [$inputData['start_date'], $inputData['end_date']]);
  46. }
  47. $lists = $model->orderByDesc('created_at')->paginate($pageSize, ['*'], 'page', $page);
  48. $res = [];
  49. foreach ($lists->items() as $k => $v) {
  50. $res['data'][$k]['order_sn'] = $v->order_sn;
  51. $res['data'][$k]['merchant_order_sn'] = $v->merchant_order_sn;
  52. $res['data'][$k]['merchant_name'] = $v->merchant->username ?? '';
  53. $res['data'][$k]['order_amount'] = $v->order_amount;
  54. $res['data'][$k]['real_amount'] = $v->real_amount;
  55. $res['data'][$k]['status'] = $v->status;
  56. $res['data'][$k]['pay_type'] = $v->pay_type;
  57. $res['data'][$k]['notice_status'] = $v->notice_status;
  58. $res['data'][$k]['payment_name'] = $v->payment->name ?? '';
  59. $res['data'][$k]['payment_attr_name'] = $v->paymentAttr->name ?? '';
  60. $res['data'][$k]['created_at'] = !empty($v->created_at) ? Carbon::parse($v->created_at)->format('Y-m-d H:i:s') : $v->created_at;
  61. $res['data'][$k]['updated_at'] = !empty($v->updated_at) ? Carbon::parse($v->updated_at)->format('Y-m-d H:i:s') : $v->updated_at;
  62. $res['data'][$k]['notice_at'] = !empty($v->notice_at) ? Carbon::parse($v->notice_at)->format('Y-m-d H:i:s') : $v->notice_at;
  63. }
  64. $res['total'] = $lists->total();
  65. return json_success($res);
  66. }
  67. /**
  68. * 补单
  69. *
  70. * @return \Illuminate\Http\JsonResponse|mixed
  71. * @throws \Illuminate\Contracts\Container\BindingResolutionException
  72. */
  73. public function again()
  74. {
  75. $inputData = $this->getJsonData();
  76. $rules = [
  77. 'order_sn' => 'required|string',
  78. ];
  79. $validator = app('validator')->make($inputData, $rules);
  80. if ($validator->fails()) {
  81. // 如果有错误(可能是多个信息),这里只取第一个错误信息返回.
  82. return json_fail($validator->errors()->first());
  83. }
  84. $orderInfo = OrderModel::query()->where('order_sn', $inputData['order_sn'])->first();
  85. if (empty($orderInfo)) {
  86. return json_fail('订单不存在!');
  87. }
  88. if ($orderInfo->status == 2) {
  89. return json_fail('请勿重复补单!');
  90. }
  91. $orderInfo->status = 2;
  92. $orderInfo->remark = '手动补单';
  93. if ($orderInfo->save()) {
  94. // 统计事件
  95. event(new PayTotalEvent($orderInfo->merchant_uid, $orderInfo->payment_uid, $orderInfo->payment_attr_uid, $orderInfo->real_amount, 2));
  96. $noticeRes = app(OrderRepository::class)->sendSuccessCallback($inputData['order_sn']);
  97. if ($noticeRes) {
  98. return json_success('补单成功,并通知成功');
  99. } else {
  100. return json_success('补单成功,通知失败');
  101. }
  102. } else {
  103. return json_fail('补单失败');
  104. }
  105. }
  106. /**
  107. * 发送回调
  108. *
  109. * @return \Illuminate\Http\JsonResponse|mixed
  110. * @throws \Illuminate\Contracts\Container\BindingResolutionException
  111. */
  112. public function sendNotify()
  113. {
  114. $inputData = $this->getJsonData();
  115. $rules = [
  116. 'order_sn' => 'required|string',
  117. ];
  118. $validator = app('validator')->make($inputData, $rules);
  119. if ($validator->fails()) {
  120. // 如果有错误(可能是多个信息),这里只取第一个错误信息返回.
  121. return json_fail($validator->errors()->first());
  122. }
  123. $res = app(OrderRepository::class)->sendSuccessCallback($inputData['order_sn']);
  124. if ($res) {
  125. return json_success('通知成功');
  126. } else {
  127. return json_fail('通知失败');
  128. }
  129. }
  130. /**
  131. * 通道统计
  132. *
  133. * @return \Illuminate\Http\JsonResponse|mixed
  134. * @throws \Illuminate\Contracts\Container\BindingResolutionException
  135. */
  136. public function channelTotal()
  137. {
  138. $inputData = $this->getJsonData();
  139. $rules = [
  140. 'page' => 'required|integer',
  141. 'page_size' => 'required|integer',
  142. 'payment_uid' => 'nullable|string',
  143. 'start_date' => 'nullable|date',
  144. 'end_date' => 'nullable|date',
  145. ];
  146. $validator = app('validator')->make($inputData, $rules);
  147. if ($validator->fails()) {
  148. // 如果有错误(可能是多个信息),这里只取第一个错误信息返回.
  149. return json_fail($validator->errors()->first());
  150. }
  151. $model = PayTotalModel::query()->selectRaw("sum(total_order) as total_order, sum(success_order) as success_order, sum(total_amount) as total_amount, sum(success_amount) as success_amount, merchant_uid, date, payment_attr_uid, payment_uid");
  152. if (!empty($inputData['payment_uid'])) {
  153. $model = $model->where('payment_uid', $inputData['payment_uid']);
  154. }
  155. if (!empty($inputData['start_date']) && !empty($inputData['end_date'])) {
  156. $model = $model->whereBetween('created_at', [$inputData['start_date'], $inputData['end_date']]);
  157. }
  158. $pageSize = $inputData['page_size'] ?? CommonConstant::PAGE_SIZE;
  159. if ($pageSize > 500) {
  160. $pageSize = CommonConstant::PAGE_SIZE;
  161. }
  162. $page = format_page($inputData['page'] ?? 0);
  163. $lists = $model->groupBy('payment_attr_uid', 'date')->orderByDesc('date')->paginate($pageSize, ['*'], 'page', $page);
  164. $res = [];
  165. foreach ($lists->items() as $k => $val) {
  166. $res['data'][$k]['payment_name'] = $val->payment->name ?? '';
  167. $res['data'][$k]['payment_attr_name'] = $val->paymentAttr->name ?? '';
  168. $res['data'][$k]['total_order'] = $val->total_order;
  169. $res['data'][$k]['success_order'] = $val->success_order;
  170. $res['data'][$k]['total_amount'] = $val->total_amount;
  171. $res['data'][$k]['success_amount'] = $val->success_amount;
  172. $prob = round($val->success_order / $val->total_order, 2);
  173. $res['data'][$k]['success_prob'] = round($prob * 100);
  174. $res['data'][$k]['date'] = $val->date;
  175. }
  176. $res['total'] = $lists->total();
  177. return json_success($res);
  178. }
  179. /**
  180. * 商户统计
  181. *
  182. * @return \Illuminate\Http\JsonResponse|mixed
  183. * @throws \Illuminate\Contracts\Container\BindingResolutionException
  184. */
  185. public function merchantTotal()
  186. {
  187. $inputData = $this->getJsonData();
  188. $rules = [
  189. 'page' => 'required|integer',
  190. 'page_size' => 'required|integer',
  191. 'merchant_uid' => 'nullable|string',
  192. 'start_date' => 'nullable|date',
  193. 'end_date' => 'nullable|date',
  194. ];
  195. $validator = app('validator')->make($inputData, $rules);
  196. if ($validator->fails()) {
  197. // 如果有错误(可能是多个信息),这里只取第一个错误信息返回.
  198. return json_fail($validator->errors()->first());
  199. }
  200. $model = PayTotalModel::query()->selectRaw("sum(total_order) as total_order, sum(success_order) as success_order, sum(total_amount) as total_amount, sum(success_amount) as success_amount, merchant_uid, date");
  201. if (!empty($inputData['merchant_uid'])) {
  202. $model = $model->where('merchant_uid', $inputData['merchant_uid']);
  203. }
  204. if (!empty($inputData['start_date']) && !empty($inputData['end_date'])) {
  205. $model = $model->whereBetween('created_at', [$inputData['start_date'], $inputData['end_date']]);
  206. }
  207. $pageSize = $inputData['page_size'] ?? CommonConstant::PAGE_SIZE;
  208. if ($pageSize > 500) {
  209. $pageSize = CommonConstant::PAGE_SIZE;
  210. }
  211. $page = format_page($inputData['page'] ?? 0);
  212. $lists = $model->orderByDesc('date')->groupBy('merchant_uid', 'date')->paginate($pageSize, ["*"], 'page', $page);
  213. $res = [];
  214. foreach ($lists->items() as $k => $val) {
  215. $res['data'][$k]['merchant_name'] = $val->merchant->username;
  216. $res['data'][$k]['total_order'] = $val->total_order;
  217. $res['data'][$k]['success_order'] = $val->success_order;
  218. $res['data'][$k]['total_amount'] = $val->total_amount;
  219. $res['data'][$k]['success_amount'] = $val->success_amount;
  220. $prob = round($val->success_order / $val->total_order, 2);
  221. $res['data'][$k]['success_prob'] = round($prob * 100);
  222. $res['data'][$k]['date'] = $val->date;
  223. }
  224. $res['total'] = $lists->total();
  225. return json_success($res);
  226. }
  227. }