From 40a65297b21062e42e9f8638b3da8b8d5d22b3c7 Mon Sep 17 00:00:00 2001 From: weigang Date: Fri, 18 Sep 2020 10:39:27 +0800 Subject: [PATCH] =?UTF-8?q?=E8=87=AA=E5=8A=A8=E5=8F=96=E6=B6=88=E8=AE=A2?= =?UTF-8?q?=E5=8D=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app/Constants/v3/LogLabel.php | 5 ++ .../v3/Implementations/OrderOnlineService.php | 81 ++++++++++--------- 2 files changed, 48 insertions(+), 38 deletions(-) diff --git a/app/Constants/v3/LogLabel.php b/app/Constants/v3/LogLabel.php index 48ce8d5..a5c5bf0 100644 --- a/app/Constants/v3/LogLabel.php +++ b/app/Constants/v3/LogLabel.php @@ -102,4 +102,9 @@ class LogLabel extends AbstractConstants */ const PAY_TO_WX_FAIL_LOG = 'pay_to_wx_fail_log'; + /** + * @Message("自动取消订单失败") + */ + const ORDER_AUTO_CANCEL_FAIL_LOG = 'order_auto_cancel_fail_log'; + } diff --git a/app/Service/v3/Implementations/OrderOnlineService.php b/app/Service/v3/Implementations/OrderOnlineService.php index 01362b8..177459a 100644 --- a/app/Service/v3/Implementations/OrderOnlineService.php +++ b/app/Service/v3/Implementations/OrderOnlineService.php @@ -647,51 +647,56 @@ class OrderOnlineService implements OrderOnlineServiceInterface 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()]); } + } } \ No newline at end of file