Browse Source

自动取消订单

master
weigang 5 years ago
parent
commit
40a65297b2
  1. 5
      app/Constants/v3/LogLabel.php
  2. 81
      app/Service/v3/Implementations/OrderOnlineService.php

5
app/Constants/v3/LogLabel.php

@ -102,4 +102,9 @@ class LogLabel extends AbstractConstants
*/ */
const PAY_TO_WX_FAIL_LOG = 'pay_to_wx_fail_log'; const PAY_TO_WX_FAIL_LOG = 'pay_to_wx_fail_log';
/**
* @Message("自动取消订单失败")
*/
const ORDER_AUTO_CANCEL_FAIL_LOG = 'order_auto_cancel_fail_log';
} }

81
app/Service/v3/Implementations/OrderOnlineService.php

@ -647,51 +647,56 @@ class OrderOnlineService implements OrderOnlineServiceInterface
public function autoCancel() public function autoCancel()
{ {
$orderMains = OrderMain::query()
->select(['global_order_id', 'user_id'])
->where(['state' => OrderState::UNPAID])
->where('created_at', '<', time()-900)
->get();
foreach ($orderMains as $key => &$orderMain) {
// 订单待支付
$orderMain->state = OrderState::CANCELED;
if (!$orderMain->save()) {
throw new ErrorCodeException(ErrorCode::ORDER_NOT_AVAILABLE);
}
// 退还优惠券
$this->couponService->orderRefundCoupons($orderMain->global_order_id);
try {
// 撤销活动商品购买记录
$orders = Order::query()->where(['order_main_id' => $orderMain->global_order_id])->get()->toArray();
$orderGoods = OrderGoods::query()
->whereIn('order_id', array_values(array_column($orders, 'id')))
->get()
->toArray();
foreach ($orderGoods as $key => &$goods) {
if ($goods['activity_type'] == 2) {
$this->goodsActivityService->clearCacheRecord($goods['goods_id'], $goods['number'], $orderMain->user_id);
$orderMains = OrderMain::query()
->select(['global_order_id', 'user_id'])
->where(['state' => OrderState::UNPAID])
->where('created_at', '<', time()-900)
->get();
foreach ($orderMains as $key => &$orderMain) {
// 订单取消
OrderMain::query()->where(['id' => $orderMain->id])->update(['state' => OrderState::CANCELED]);
// 退还优惠券
$this->couponService->orderRefundCoupons($orderMain->global_order_id);
// 撤销活动商品购买记录
$orders = Order::query()->where(['order_main_id' => $orderMain->global_order_id])->get()->toArray();
$orderGoods = OrderGoods::query()
->whereIn('order_id', array_values(array_column($orders, 'id')))
->get()
->toArray();
foreach ($orderGoods as $key => &$goods) {
if ($goods['activity_type'] == 2) {
$this->goodsActivityService->clearCacheRecord($goods['goods_id'], $goods['number'], $orderMain->user_id);
}
} }
}
// 释redis库存
$redis = ApplicationContext::getContainer()->get(Redis::class);
foreach ($orderGoods as $k => &$goodsItem) {
// 拼接activity_type和goods_id
$inventoryKey = 'goods_inventory_sold_'.$goodsItem['activity_type'].'_'.$goodsItem['goods_id'];
// redis记录当前商品的购买数量,压库存,下单失败、下单成功扣库存成功、订单取消的时候释放
if (!$redis->exists($inventoryKey)) {
$redis->set($inventoryKey, 0);
} else {
$redis->decrBy($inventoryKey, intval($goodsItem['number']));
// 释redis库存
$redis = ApplicationContext::getContainer()->get(Redis::class);
foreach ($orderGoods as $k => &$goodsItem) {
// 拼接activity_type和goods_id
$inventoryKey = 'goods_inventory_sold_'.$goodsItem['activity_type'].'_'.$goodsItem['goods_id'];
// redis记录当前商品的购买数量,压库存,下单失败、下单成功扣库存成功、订单取消的时候释放
if (!$redis->exists($inventoryKey)) {
$redis->set($inventoryKey, 0);
} else {
$redis->decrBy($inventoryKey, intval($goodsItem['number']));
}
} }
// 记录badge
$orderChildIds = array_values(array_column($orders, 'store_id'));
$this->badgeService->doByOrder($orderMain->user_id, $orderChildIds, $orderMain->global_order_id, OrderState::CANCELED);
} }
// 记录badge
$orderChildIds = array_values(array_column($orders, 'store_id'));
$this->badgeService->doByOrder($orderMain->user_id, $orderChildIds, $orderMain->global_order_id, OrderState::CANCELED);
} catch (Exception $e) {
$this->log->event(LogLabel::ORDER_AUTO_CANCEL_FAIL_LOG, ['message' => $e->getMessage()]);
} }
} }
} }
Loading…
Cancel
Save