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/Controller/v3/NotifyController.php b/app/Controller/v3/NotifyController.php index 16d0bc3..fb6cc66 100644 --- a/app/Controller/v3/NotifyController.php +++ b/app/Controller/v3/NotifyController.php @@ -322,8 +322,8 @@ class NotifyController extends BaseController // 查询订单 $orderMain = OrderMain::query() - ->whereIn('state', [OrderState::PAID, OrderState::DELIVERY, OrderState::COMPLETED, OrderState::EVALUATED, OrderState::REFUNDING]) - ->where(['global_order_id' => $reqInfo['out_trade_no'], 'pay_type' => Payment::WECHAT, 'refund_time' => 0]) + ->whereNotIn('state', [OrderState::UNPAID]) + ->where(['global_order_id' => $reqInfo['out_trade_no'], 'pay_type' => Payment::WECHAT]) ->first(); // 订单不存在 diff --git a/app/Crontab/AutoCancelOrder.php b/app/Crontab/AutoCancelOrder.php index dda86f7..24edc16 100644 --- a/app/Crontab/AutoCancelOrder.php +++ b/app/Crontab/AutoCancelOrder.php @@ -7,7 +7,7 @@ use Hyperf\Crontab\Annotation\Crontab; use Hyperf\Di\Annotation\Inject; /** - * @Crontab(name="autocancelorder", rule="*\/5 * * * * *", callback="execute", memo="自定取消15分钟过期订单") + * @Crontab(name="autocancelorder", rule="*\/1 * * * *", callback="execute", memo="自定取消15分钟过期订单") */ class AutoCancelOrder { diff --git a/app/JsonRpc/OrdersService.php b/app/JsonRpc/OrdersService.php index bc36bdc..e12d9d5 100644 --- a/app/JsonRpc/OrdersService.php +++ b/app/JsonRpc/OrdersService.php @@ -154,7 +154,7 @@ class OrdersService implements OrdersServiceInterface // 主订单 $orderMain = OrderMain::query() ->where(['global_order_id' => $global_order_id, 'user_id' => $user_id]) - ->whereIn('state', OrderState::CAN_REFUND_DIRECT) + ->whereIn('state', array_merge(OrderState::CAN_REFUND_DIRECT, [OrderState::REFUNDED])) ->first(); if (is_null($orderMain)) { @@ -302,7 +302,7 @@ class OrdersService implements OrdersServiceInterface $this->financialRecordService->storeRefundDirect($order->store->user_id, $order->id, $refundStoreAmount); } - } elseif ($refundType == 'sub') { # 退子订单或者退单品的话,商户只有一个 + } elseif ($refundType == 'sub'||$refundType == 'goods') { # 退子订单或者退单品的话,商户只有一个 $this->financialRecordService->storeRefundDirect($orderChild->store->user_id, $orderChild->id, $refundAmount); } diff --git a/app/Service/v3/Implementations/OrderOnlineService.php b/app/Service/v3/Implementations/OrderOnlineService.php index 01362b8..88963d5 100644 --- a/app/Service/v3/Implementations/OrderOnlineService.php +++ b/app/Service/v3/Implementations/OrderOnlineService.php @@ -639,6 +639,22 @@ class OrderOnlineService implements OrderOnlineServiceInterface $orderMain = $this->check($globalOrderId, $userId, OrderState::REFUNDING); + $orderIds = Order::query()->where(['order_main_id' => $orderMain->global_order_id])->pluck('id'); + $orderGoods = OrderGoods::query()->whereIn('order_id', $orderIds)->get()->toArray(); + + // 释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'])); + } + } + // 微信退款 if ($orderMain->pay_type == Payment::WECHAT) { return $this->paymentService->undo($orderMain->global_order_id, $userId); @@ -647,51 +663,55 @@ 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) { + try { - // 订单待支付 - $orderMain->state = OrderState::CANCELED; - if (!$orderMain->save()) { - throw new ErrorCodeException(ErrorCode::ORDER_NOT_AVAILABLE); - } + $orderMains = OrderMain::query() + ->where(['state' => OrderState::UNPAID]) + ->where('created_at', '<', time()-900) + ->get(); - // 退还优惠券 - $this->couponService->orderRefundCoupons($orderMain->global_order_id); + foreach ($orderMains as $key => &$orderMain) { - // 撤销活动商品购买记录 - $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); + // 订单取消 + 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