From 927a7e7a293e10404ec938abc21616f52de4fab2 Mon Sep 17 00:00:00 2001 From: weigang Date: Fri, 18 Sep 2020 10:34:38 +0800 Subject: [PATCH 1/4] =?UTF-8?q?=E5=8D=95=E7=AC=94=E9=80=80=E6=AC=BE?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app/JsonRpc/OrdersService.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/JsonRpc/OrdersService.php b/app/JsonRpc/OrdersService.php index bc36bdc..51b746a 100644 --- a/app/JsonRpc/OrdersService.php +++ b/app/JsonRpc/OrdersService.php @@ -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); } From 40a65297b21062e42e9f8638b3da8b8d5d22b3c7 Mon Sep 17 00:00:00 2001 From: weigang Date: Fri, 18 Sep 2020 10:39:27 +0800 Subject: [PATCH 2/4] =?UTF-8?q?=E8=87=AA=E5=8A=A8=E5=8F=96=E6=B6=88?= =?UTF-8?q?=E8=AE=A2=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 From 1f193747bcc50f869bc80a8aa1608ce8d840fa27 Mon Sep 17 00:00:00 2001 From: weigang Date: Fri, 18 Sep 2020 11:38:01 +0800 Subject: [PATCH 3/4] =?UTF-8?q?=E9=80=80=E6=AC=BE=E9=80=9A=E7=9F=A5?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app/Controller/v3/NotifyController.php | 4 ++-- app/Crontab/AutoCancelOrder.php | 2 +- app/JsonRpc/OrdersService.php | 2 +- app/Service/v3/Implementations/OrderOnlineService.php | 1 - 4 files changed, 4 insertions(+), 5 deletions(-) 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 51b746a..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)) { diff --git a/app/Service/v3/Implementations/OrderOnlineService.php b/app/Service/v3/Implementations/OrderOnlineService.php index 177459a..bf6c5f6 100644 --- a/app/Service/v3/Implementations/OrderOnlineService.php +++ b/app/Service/v3/Implementations/OrderOnlineService.php @@ -651,7 +651,6 @@ class OrderOnlineService implements OrderOnlineServiceInterface try { $orderMains = OrderMain::query() - ->select(['global_order_id', 'user_id']) ->where(['state' => OrderState::UNPAID]) ->where('created_at', '<', time()-900) ->get(); From b50ec7991ed8c68ebe80a5398764fa6a6b8982da Mon Sep 17 00:00:00 2001 From: weigang Date: Fri, 18 Sep 2020 11:59:41 +0800 Subject: [PATCH 4/4] =?UTF-8?q?=E7=94=A8=E6=88=B7=E7=94=B3=E8=AF=B7?= =?UTF-8?q?=E7=9A=84=E9=80=80=E6=AC=BE=E9=87=8A=E6=94=BE=E5=BA=93=E5=AD=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../v3/Implementations/OrderOnlineService.php | 16 ++++++++++++++++ 1 file changed, 16 insertions(+) diff --git a/app/Service/v3/Implementations/OrderOnlineService.php b/app/Service/v3/Implementations/OrderOnlineService.php index bf6c5f6..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);