| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269 |
- <?php
- namespace Modules\ManageApi\Controllers;
- use App\Constants\CommonConstant;
- use App\Events\PayTotalEvent;
- use App\Models\OrderModel;
- use App\Models\PayTotalModel;
- use App\Repositories\OrderRepository;
- use Illuminate\Support\Carbon;
- class OrderController extends BaseController
- {
- public function lists()
- {
- $inputData = $this->getJsonData();
- $rules = [
- 'page' => 'required|integer',
- 'page_size' => 'required|integer',
- 'order_sn' => 'nullable|string',
- 'merchant_uid' => 'nullable|string',
- 'status' => 'nullable|in:1,2'
- ];
- $validator = app('validator')->make($inputData, $rules);
- if ($validator->fails()) {
- // 如果有错误(可能是多个信息),这里只取第一个错误信息返回.
- return json_fail($validator->errors()->first());
- }
- $pageSize = $inputData['page_size'] ?? CommonConstant::PAGE_SIZE;
- if ($pageSize > 500) {
- $pageSize = CommonConstant::PAGE_SIZE;
- }
- $page = format_page($inputData['page'] ?? 0);
- $model = OrderModel::query();
- if (!empty($inputData['status'])) {
- $model = $model->where('status', $inputData['status']);
- }
- if (!empty($inputData['order_sn'])) {
- $model = $model->where('order_sn', $inputData['order_sn']);
- }
- if (!empty($inputData['merchant_order_sn'])) {
- $model = $model->where('merchant_order_sn', $inputData['merchant_order_sn']);
- }
- if (!empty($inputData['merchant_uid'])) {
- $model = $model->where('merchant_uid', $inputData['merchant_uid']);
- }
- if (!empty($inputData['start_date']) && !empty($inputData['end_date'])) {
- $model = $model->whereBetween('created_at', [$inputData['start_date'], $inputData['end_date']]);
- }
- $lists = $model->orderByDesc('created_at')->paginate($pageSize, ['*'], 'page', $page);
- $res = [];
- foreach ($lists->items() as $k => $v) {
- $res['data'][$k]['order_sn'] = $v->order_sn;
- $res['data'][$k]['merchant_order_sn'] = $v->merchant_order_sn;
- $res['data'][$k]['merchant_name'] = $v->merchant->username ?? '';
- $res['data'][$k]['order_amount'] = $v->order_amount;
- $res['data'][$k]['real_amount'] = $v->real_amount;
- $res['data'][$k]['status'] = $v->status;
- $res['data'][$k]['pay_type'] = $v->pay_type;
- $res['data'][$k]['notice_status'] = $v->notice_status;
- $res['data'][$k]['payment_name'] = $v->payment->name ?? '';
- $res['data'][$k]['payment_attr_name'] = $v->paymentAttr->name ?? '';
- $res['data'][$k]['created_at'] = !empty($v->created_at) ? Carbon::parse($v->created_at)->format('Y-m-d H:i:s') : $v->created_at;
- $res['data'][$k]['updated_at'] = !empty($v->updated_at) ? Carbon::parse($v->updated_at)->format('Y-m-d H:i:s') : $v->updated_at;
- $res['data'][$k]['notice_at'] = !empty($v->notice_at) ? Carbon::parse($v->notice_at)->format('Y-m-d H:i:s') : $v->notice_at;
- }
- $res['total'] = $lists->total();
- return json_success($res);
- }
- /**
- * 补单
- *
- * @return \Illuminate\Http\JsonResponse|mixed
- * @throws \Illuminate\Contracts\Container\BindingResolutionException
- */
- public function again()
- {
- $inputData = $this->getJsonData();
- $rules = [
- 'order_sn' => 'required|string',
- ];
- $validator = app('validator')->make($inputData, $rules);
- if ($validator->fails()) {
- // 如果有错误(可能是多个信息),这里只取第一个错误信息返回.
- return json_fail($validator->errors()->first());
- }
- $orderInfo = OrderModel::query()->where('order_sn', $inputData['order_sn'])->first();
- if (empty($orderInfo)) {
- return json_fail('订单不存在!');
- }
- if ($orderInfo->status == 2) {
- return json_fail('请勿重复补单!');
- }
- $orderInfo->status = 2;
- $orderInfo->remark = '手动补单';
- if ($orderInfo->save()) {
- // 统计事件
- event(new PayTotalEvent($orderInfo->merchant_uid, $orderInfo->payment_uid, $orderInfo->payment_attr_uid, $orderInfo->real_amount, 2));
- $noticeRes = app(OrderRepository::class)->sendSuccessCallback($inputData['order_sn']);
- if ($noticeRes) {
- return json_success('补单成功,并通知成功');
- } else {
- return json_success('补单成功,通知失败');
- }
- } else {
- return json_fail('补单失败');
- }
- }
- /**
- * 发送回调
- *
- * @return \Illuminate\Http\JsonResponse|mixed
- * @throws \Illuminate\Contracts\Container\BindingResolutionException
- */
- public function sendNotify()
- {
- $inputData = $this->getJsonData();
- $rules = [
- 'order_sn' => 'required|string',
- ];
- $validator = app('validator')->make($inputData, $rules);
- if ($validator->fails()) {
- // 如果有错误(可能是多个信息),这里只取第一个错误信息返回.
- return json_fail($validator->errors()->first());
- }
- $res = app(OrderRepository::class)->sendSuccessCallback($inputData['order_sn']);
- if ($res) {
- return json_success('通知成功');
- } else {
- return json_fail('通知失败');
- }
- }
- /**
- * 通道统计
- *
- * @return \Illuminate\Http\JsonResponse|mixed
- * @throws \Illuminate\Contracts\Container\BindingResolutionException
- */
- public function channelTotal()
- {
- $inputData = $this->getJsonData();
- $rules = [
- 'page' => 'required|integer',
- 'page_size' => 'required|integer',
- 'payment_uid' => 'nullable|string',
- 'start_date' => 'nullable|date',
- 'end_date' => 'nullable|date',
- ];
- $validator = app('validator')->make($inputData, $rules);
- if ($validator->fails()) {
- // 如果有错误(可能是多个信息),这里只取第一个错误信息返回.
- return json_fail($validator->errors()->first());
- }
- $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");
- if (!empty($inputData['payment_uid'])) {
- $model = $model->where('payment_uid', $inputData['payment_uid']);
- }
- if (!empty($inputData['start_date']) && !empty($inputData['end_date'])) {
- $model = $model->whereBetween('created_at', [$inputData['start_date'], $inputData['end_date']]);
- }
- $pageSize = $inputData['page_size'] ?? CommonConstant::PAGE_SIZE;
- if ($pageSize > 500) {
- $pageSize = CommonConstant::PAGE_SIZE;
- }
- $page = format_page($inputData['page'] ?? 0);
- $lists = $model->groupBy('payment_attr_uid', 'date')->orderByDesc('date')->paginate($pageSize, ['*'], 'page', $page);
- $res = [];
- foreach ($lists->items() as $k => $val) {
- $res['data'][$k]['payment_name'] = $val->payment->name ?? '';
- $res['data'][$k]['payment_attr_name'] = $val->paymentAttr->name ?? '';
- $res['data'][$k]['total_order'] = $val->total_order;
- $res['data'][$k]['success_order'] = $val->success_order;
- $res['data'][$k]['total_amount'] = $val->total_amount;
- $res['data'][$k]['success_amount'] = $val->success_amount;
- $prob = round($val->success_order / $val->total_order, 2);
- $res['data'][$k]['success_prob'] = round($prob * 100);
- $res['data'][$k]['date'] = $val->date;
- }
- $res['total'] = $lists->total();
- return json_success($res);
- }
- /**
- * 商户统计
- *
- * @return \Illuminate\Http\JsonResponse|mixed
- * @throws \Illuminate\Contracts\Container\BindingResolutionException
- */
- public function merchantTotal()
- {
- $inputData = $this->getJsonData();
- $rules = [
- 'page' => 'required|integer',
- 'page_size' => 'required|integer',
- 'merchant_uid' => 'nullable|string',
- 'start_date' => 'nullable|date',
- 'end_date' => 'nullable|date',
- ];
- $validator = app('validator')->make($inputData, $rules);
- if ($validator->fails()) {
- // 如果有错误(可能是多个信息),这里只取第一个错误信息返回.
- return json_fail($validator->errors()->first());
- }
- $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");
- if (!empty($inputData['merchant_uid'])) {
- $model = $model->where('merchant_uid', $inputData['merchant_uid']);
- }
- if (!empty($inputData['start_date']) && !empty($inputData['end_date'])) {
- $model = $model->whereBetween('created_at', [$inputData['start_date'], $inputData['end_date']]);
- }
- $pageSize = $inputData['page_size'] ?? CommonConstant::PAGE_SIZE;
- if ($pageSize > 500) {
- $pageSize = CommonConstant::PAGE_SIZE;
- }
- $page = format_page($inputData['page'] ?? 0);
- $lists = $model->orderByDesc('date')->groupBy('merchant_uid', 'date')->paginate($pageSize, ["*"], 'page', $page);
- $res = [];
- foreach ($lists->items() as $k => $val) {
- $res['data'][$k]['merchant_name'] = $val->merchant->username;
- $res['data'][$k]['total_order'] = $val->total_order;
- $res['data'][$k]['success_order'] = $val->success_order;
- $res['data'][$k]['total_amount'] = $val->total_amount;
- $res['data'][$k]['success_amount'] = $val->success_amount;
- $prob = round($val->success_order / $val->total_order, 2);
- $res['data'][$k]['success_prob'] = round($prob * 100);
- $res['data'][$k]['date'] = $val->date;
- }
- $res['total'] = $lists->total();
- return json_success($res);
- }
- }
|