From 5aff6badfa1dc78b9c1402d13ae68e5a7e7253ec Mon Sep 17 00:00:00 2001 From: lemon <15040771@qq.com> Date: Mon, 27 Sep 2021 18:33:40 +0800 Subject: [PATCH] =?UTF-8?q?=E8=AE=A2=E5=8D=95=E5=8F=96=E6=B6=88?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app/Http/Controllers/Api/OrderController.php | 7 +- app/Http/Controllers/Api/WxpayController.php | 6 +- app/Jobs/OrderTimeout.php | 104 +++++++++++++++++++ 3 files changed, 114 insertions(+), 3 deletions(-) create mode 100644 app/Jobs/OrderTimeout.php diff --git a/app/Http/Controllers/Api/OrderController.php b/app/Http/Controllers/Api/OrderController.php index 7bfd176..7edc61b 100644 --- a/app/Http/Controllers/Api/OrderController.php +++ b/app/Http/Controllers/Api/OrderController.php @@ -5,6 +5,7 @@ namespace App\Http\Controllers\Api; use App\Common\PayType; use App\Common\ProductStatus; use App\Http\Controllers\Controller; +use App\Jobs\OrderTimeout; use App\Models\AdminSetting; use App\Models\Agent; use App\Models\AgentProduct; @@ -294,11 +295,12 @@ class OrderController extends Controller $prepayTimeout = $ap->earnest_timeout; } + $orderNo = $this->getOrderNo(); // 存入订单表 $order = Order::query()->create([ 'user_id' => $this->user_id, 'agent_id' => $this->agent_id, - 'order_no' => $this->getOrderNo(), + 'order_no' => $orderNo, 'num' => $formData['num'], 'price' => $order_price, 'name' => $formData['name'], @@ -337,6 +339,9 @@ class OrderController extends Controller 'service_persons' => $ap->product->service_persons, ]); + //订单超时 + OrderTimeout::dispatch($orderNo,$order_timeout * 60); + DB::commit(); } catch (\Exception $e) { DB::rollBack(); diff --git a/app/Http/Controllers/Api/WxpayController.php b/app/Http/Controllers/Api/WxpayController.php index 654b6f7..02087b5 100644 --- a/app/Http/Controllers/Api/WxpayController.php +++ b/app/Http/Controllers/Api/WxpayController.php @@ -3,6 +3,7 @@ namespace App\Http\Controllers\Api; use App\Common\PayType; use App\Jobs\BalanceDue; +use App\Jobs\OrderTimeout; use App\Models\AdminSetting; use App\Models\Agent; use App\Models\AgentProduct; @@ -105,16 +106,17 @@ class WxpayController $time = (AgentSetting::val($agent_id, 'order_timeout') ?? 60) * 60; } $order->timeout = date('Y-m-d H:i:s', time() + $time); + //订单超时 + OrderTimeout::dispatch($order->order_no,$time); //尾款通知时间 默认为剩余三小时自动通知 $smsEarnest = env('SMS_EARNEST',60*60*24*3); //短信通知 if(env('SMS_SWITCH' , '') == true && $time > $smsEarnest) { //如果剩余时间大于三小时 在订单到期前三小时给用户发短信 if ($time > $smsEarnest) { - BalanceDue::dispatch('2108301532315779206730',$time - $smsEarnest); + BalanceDue::dispatch($order->order_no,$time - $smsEarnest); } } - } else { $order->timeout = null; } diff --git a/app/Jobs/OrderTimeout.php b/app/Jobs/OrderTimeout.php new file mode 100644 index 0000000..f476d47 --- /dev/null +++ b/app/Jobs/OrderTimeout.php @@ -0,0 +1,104 @@ +orderNumber = $orderNumber; + $this->delay = $delay; + } + + /** + * Execute the job. + * + * @return void + */ + public function handle() + { + //需要处理的订单状态 + $status_arr = [OrderStatus::UNPAID, OrderStatus::PAY_EARNEST, OrderStatus::OFFLINE_UNPAID]; + + //记录最小ID,下次查询时按ID正序查询,只处理大于该ID的订单,避免重复扫描数据库 + /*$min_id = Order::query() + ->whereIn('status', $status_arr) + ->whereNotNull('timeout') + ->min('id');*/ + $v = Order::with('orderProductItem') + // ->where('id', '>=', $min_id) + ->whereIn('status', $status_arr) + ->whereNotNull('timeout') + ->where('order_no', $this->orderNumber) + ->first(); + + if (!empty($v) && !is_null($v->timeout) && strtotime($v->timeout) < time()) { + DB::beginTransaction(); + try { + //取消订单 + $v->status = OrderStatus::CANCEL; + $v->save(); + + //供应商产品加库存 + Product::whereIn('id', explode(',', $v->product_ids))->increment('stock', $v->num); + + //代理商产品加库存 + AgentProduct::where('id', $v->agent_product_id)->increment('stock', $v->num); + + if (!$v->orderProductItem->isEmpty()) { + $item = $v->orderProductItem->toArray(); + + //供应商产品规格加库存 + foreach ($item as $v2) { + if ($v2['product_spec_id']) { + if (is_array($v2['product_spec_id'])) { + ProductSpec::whereIn('id', $v2['product_spec_id'])->increment('stock', $v->num); + } else { + ProductSpec::where('id', $v2['product_spec_id'])->increment('stock', $v->num); + } + } + } + + //代理商产品规格加库存 + foreach ($item as $v2) { + if ($v2['agent_product_spec_id']) { + if (is_array($v2['agent_product_spec_id'])) { + AgentProductSpec::whereIn('id', $v2['agent_product_spec_id'])->increment('stock', $v->num); + } else { + AgentProductSpec::where('id', $v2['agent_product_spec_id'])->increment('stock', $v->num); + } + } + } + } + + DB::commit(); + } catch (\Exception $exception) { + DB::rollBack(); + } + } + } +}