确认订单
parent
4c8225675d
commit
31a887554d
|
|
@ -133,7 +133,21 @@ class OrderController extends Controller
|
||||||
*/
|
*/
|
||||||
public function confirm($id, Request $request)
|
public function confirm($id, Request $request)
|
||||||
{
|
{
|
||||||
// 确认收货
|
$user = $request->user();
|
||||||
|
|
||||||
|
try {
|
||||||
|
return DB::transaction(function () use ($id, $user) {
|
||||||
|
$order = $user->orders()->lockForUpdate()->findOrFail($id);
|
||||||
|
|
||||||
|
(new OrderService())->confirm($order);
|
||||||
|
});
|
||||||
|
} catch (ModelNotFoundException | BizException $e) {
|
||||||
|
throw $e;
|
||||||
|
} catch (Throwable $e) {
|
||||||
|
report($e);
|
||||||
|
|
||||||
|
throw new BizException('确认失败,请重试');
|
||||||
|
}
|
||||||
|
|
||||||
return response()->noContent();
|
return response()->noContent();
|
||||||
}
|
}
|
||||||
|
|
@ -206,7 +220,7 @@ class OrderController extends Controller
|
||||||
} catch (Throwable $e) {
|
} catch (Throwable $e) {
|
||||||
report($e);
|
report($e);
|
||||||
|
|
||||||
throw new BizException('订单支付失败,请重试');
|
throw new BizException('支付失败,请重试');
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -11,14 +11,11 @@ use App\Exceptions\ShippingNotSupportedException;
|
||||||
use App\Helpers\Numeric;
|
use App\Helpers\Numeric;
|
||||||
use App\Helpers\Order as OrderHelper;
|
use App\Helpers\Order as OrderHelper;
|
||||||
use App\Models\Order;
|
use App\Models\Order;
|
||||||
use App\Models\OrderPackage;
|
|
||||||
use App\Models\OrderProduct;
|
use App\Models\OrderProduct;
|
||||||
use App\Models\ProductSku;
|
use App\Models\ProductSku;
|
||||||
use App\Models\ShippingAddress;
|
use App\Models\ShippingAddress;
|
||||||
use App\Models\User;
|
use App\Models\User;
|
||||||
use App\Models\UserCoupon;
|
use App\Models\UserCoupon;
|
||||||
use Carbon\Carbon;
|
|
||||||
use Illuminate\Support\Collection;
|
|
||||||
use Illuminate\Support\Facades\DB;
|
use Illuminate\Support\Facades\DB;
|
||||||
|
|
||||||
class OrderService
|
class OrderService
|
||||||
|
|
@ -641,103 +638,33 @@ class OrderService
|
||||||
// todo 处理预收益
|
// todo 处理预收益
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
|
||||||
* 更新包裹状态
|
|
||||||
*
|
|
||||||
* @param Collection|null $packages
|
|
||||||
* @param integer $status
|
|
||||||
* @return void
|
|
||||||
*/
|
|
||||||
public function updatePackageStatus(OrderPackage $package, int $status)
|
|
||||||
{
|
|
||||||
//如果包裹已签收则不再更新包裹状态
|
|
||||||
if ($package->status == OrderPackage::STATUS_CHECK || $package->status == OrderPackage::STATUS_AUTOCHECK) {
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
//如果签收状态
|
|
||||||
if ($status == OrderPackage::STATUS_CHECK || $status == OrderPackage::STATUS_AUTOCHECK) {
|
|
||||||
$this->checkOrderPackage($package, $status);
|
|
||||||
} else {
|
|
||||||
$package->update([
|
|
||||||
'status'=>$status,
|
|
||||||
]);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 订单确认收货
|
* 订单确认收货
|
||||||
*
|
*
|
||||||
|
* @param \App\Models\Order $order
|
||||||
* @return void
|
* @return void
|
||||||
*/
|
*/
|
||||||
public function checkOrder(Order $order)
|
public function confirm(Order $order)
|
||||||
{
|
{
|
||||||
//获取订单的未作废未签收包裹
|
if (! $order->isShipped()) {
|
||||||
|
throw new BizException('订单包裹未发完');
|
||||||
|
}
|
||||||
|
|
||||||
|
$time = now();
|
||||||
|
|
||||||
|
$orderPackageService = new OrderPackageService();
|
||||||
|
|
||||||
|
// 获取订单的未作废未签收包裹
|
||||||
$packages = $order->packages()->unchecked()->where('is_failed', false)->get();
|
$packages = $order->packages()->unchecked()->where('is_failed', false)->get();
|
||||||
|
|
||||||
foreach ($packages as $package) {
|
foreach ($packages as $package) {
|
||||||
$this->checkPackage($package, OrderPackage::STATUS_AUTOCHECK);
|
$orderPackageService->checkPackage($package, true, $time);
|
||||||
}
|
|
||||||
if ($order->isShipped()
|
|
||||||
&& OrderPackage::where('order_id', $order->id)->unchecked()->doesntExist()
|
|
||||||
) {
|
|
||||||
//更新订单完成
|
|
||||||
$order->update([
|
|
||||||
'status' => Order::STATUS_COMPLETED,
|
|
||||||
'completed_at' => now(),
|
|
||||||
]);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* 签收订单包裹:会更新订单状态
|
|
||||||
*
|
|
||||||
* @param OrderPackage $package
|
|
||||||
* @param integer $status
|
|
||||||
* @param Carbon|null $time
|
|
||||||
* @return void
|
|
||||||
*/
|
|
||||||
public function checkOrderPackage(OrderPackage $package, int $status, ?Carbon $time = null)
|
|
||||||
{
|
|
||||||
$this->checkPackage($package, $status);
|
|
||||||
//如果订单是发货完成状态,且所有包裹都签收了
|
|
||||||
if ($package->order->isShipped()
|
|
||||||
&& OrderPackage::where('order_id', $package->order_id)->unchecked()->doesntExist()
|
|
||||||
) {
|
|
||||||
//更新订单完成
|
|
||||||
$package->order->update([
|
|
||||||
'status' => Order::STATUS_COMPLETED,
|
|
||||||
'completed_at' => now(),
|
|
||||||
]);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* 签收包裹
|
|
||||||
*
|
|
||||||
* status 区分3签收(物流推送签收)和11自动签收(属于用户手动点,或者时间到了)
|
|
||||||
* @return void
|
|
||||||
*/
|
|
||||||
protected function checkPackage(OrderPackage $package, int $status, ?Carbon $time = null)
|
|
||||||
{
|
|
||||||
//如果不是签收状态,则直接退出
|
|
||||||
if (!in_array($status, [OrderPackage::STATUS_CHECK, OrderPackage::STATUS_AUTOCHECK])) {
|
|
||||||
return;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
$checkTime = $time ?? now();//没指定签收时间,则默认当前时间
|
// 将订单标记为已完成
|
||||||
|
$order->update([
|
||||||
//物流签收,更新包裹状态。
|
'status' => Order::STATUS_COMPLETED,
|
||||||
// if ($status == OrderPackage::STATUS_CHECK) { //自动签收不更新包裹状态
|
'completed_at' => $time,
|
||||||
$package->update([
|
|
||||||
'status'=> $status,
|
|
||||||
'checked_at' => $checkTime,
|
|
||||||
]);
|
]);
|
||||||
// }
|
|
||||||
//如果这个包裹的订单状态是发货中,发货完成
|
|
||||||
if ($package->order->isShipped() || $package->order->isShipping()) {
|
|
||||||
//处理这个包裹的商品的售后过期时间
|
|
||||||
$package->orderProducts()->update([
|
|
||||||
'after_expire_at'=>$checkTime->addDays(config('settings.sale_after_expire_days', 7)),
|
|
||||||
]);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue