Browse Source

订单取消

master
lemon 4 years ago
parent
commit
5aff6badfa
  1. 7
      app/Http/Controllers/Api/OrderController.php
  2. 6
      app/Http/Controllers/Api/WxpayController.php
  3. 104
      app/Jobs/OrderTimeout.php

7
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();

6
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;
}

104
app/Jobs/OrderTimeout.php

@ -0,0 +1,104 @@
<?php
namespace App\Jobs;
use App\Common\OrderStatus;
use App\Models\AgentProduct;
use App\Models\AgentProductSpec;
use App\Models\Order;
use App\Models\Product;
use App\Models\ProductSpec;
use Illuminate\Bus\Queueable;
use Illuminate\Contracts\Queue\ShouldQueue;
use Illuminate\Foundation\Bus\Dispatchable;
use Illuminate\Queue\InteractsWithQueue;
use Illuminate\Queue\SerializesModels;
use Illuminate\Support\Facades\DB;
use Illuminate\Support\Facades\Log;
class OrderTimeout implements ShouldQueue
{
use Dispatchable, InteractsWithQueue, Queueable, SerializesModels;
protected $orderNumber = '';
protected $redis = '';
/**
* Create a new job instance.
*
* @return void
*/
public function __construct($orderNumber, $delay)
{
$this->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();
}
}
}
}
Loading…
Cancel
Save