From 272e04bfbf2ec51f042627e4d667dd437486b87d Mon Sep 17 00:00:00 2001 From: xiaohanzi Date: Thu, 18 Jun 2020 19:29:28 +0800 Subject: [PATCH] =?UTF-8?q?=E6=9B=B4=E6=96=B0=E6=8B=BC=E5=9B=A2=E5=BA=93?= =?UTF-8?q?=E5=AD=98bug?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../controller/WxOrderController.java | 28 ++++++++++++------- .../schedule/OrderExpiringSchedule.java | 13 ++++++++- .../com/iformall/enums/EnumOrderStatus.java | 4 +-- .../iformall/service/WxOrderGroupService.java | 2 +- .../com/iformall/service/WxOrderService.java | 2 ++ .../iformall/service/WxPayOrderService.java | 2 +- .../service/impl/WxOrderGroupServiceImpl.java | 14 +++++++--- .../service/impl/WxOrderServiceImpl.java | 12 ++++++++ .../service/impl/WxPayOrderServiceImpl.java | 8 +++--- 9 files changed, 62 insertions(+), 23 deletions(-) diff --git a/mallinkCApi/src/main/java/com/iformall/controller/WxOrderController.java b/mallinkCApi/src/main/java/com/iformall/controller/WxOrderController.java index af0026ce3..306dd671b 100644 --- a/mallinkCApi/src/main/java/com/iformall/controller/WxOrderController.java +++ b/mallinkCApi/src/main/java/com/iformall/controller/WxOrderController.java @@ -84,6 +84,23 @@ public class WxOrderController extends BaseController { return new ResultData(ErrorCode.MEMBER_IS_LOCKED); } + WxCoupon coupon = wxCouponService.getById(wxCouponChannel.getCouponId()); + if (null == coupon) { + return new ResultData(ErrorCode.COUPON_IS_EMPTY); + } + if (coupon.getStatus().equals(EnumCouponStatus.COUPON_STATUS_TAKE_OFFF.getCode())) { + return new ResultData(ErrorCode.COUPON_IS_TAKE_OFF); + } + //判断是否是拼团订单,如果是拼团订单,判断现在进行中的,和已完成的数量是否超出券的限制 + if (coupon.getType().equals(EnumCouponType.COUPON_GROUP.getCode())) { + if (null != orderSaveDto.getOrderGroupId() && !orderSaveDto.getOrderGroupId().equals(0L)) { + int ordercount = wxOrderService.countUserCouponGroupOrder(user.getId(),coupon.getId()); + if (ordercount>=coupon.getUseLimitQuantity()) { + return new ResultData(ErrorCode.COUPON_IS_TAKE_OFF.getCode(),"您当前此券的有效拼团数量达到券的限购次数。"); + } + } + } + WxCouponCVo wxCouponCVo = null; String key = "cc:" + orderSaveDto.getCouponChannelId(); @@ -108,7 +125,7 @@ public class WxOrderController extends BaseController { //此处判断是否存在绝对保证库存不超卖的缓存,如果没有,则把当前的库存设置为最大值。如果有,则是后台设置的时候保存的,以那个为准。 boolean hascache = redisLock.hasCouponStockCache(wxCouponCVo.getCouponId()); if (!hascache) { - redisLock.setCouponStock(wxCouponCVo.getCouponId(), wxCouponCVo.getRemainInventory()); + redisLock.setCouponStock(wxCouponCVo.getCouponId(), coupon.getRemainInventory()); } resultData = couponUserCheck(user, wxCouponCVo); @@ -123,15 +140,6 @@ public class WxOrderController extends BaseController { boolean isPress = orderSaveDto.getPress() != null ? orderSaveDto.getPress() : false; try { - - WxCoupon coupon = wxCouponService.getById(couponId); - if (coupon == null) { - return new ResultData(ErrorCode.COUPON_IS_EMPTY); - } - if (coupon.getStatus().equals(EnumCouponStatus.COUPON_STATUS_TAKE_OFFF.getCode())) { - return new ResultData(ErrorCode.COUPON_IS_TAKE_OFF); - } - WxOrder order = wxOrderService.saveOrderForCoupon(user, coupon, orderSaveDto, isPress); return new ResultData(order); } catch (MallinkException e) { diff --git a/mallinkSchedule/src/main/java/com/iformall/schedule/OrderExpiringSchedule.java b/mallinkSchedule/src/main/java/com/iformall/schedule/OrderExpiringSchedule.java index fa5411138..5827ad2eb 100644 --- a/mallinkSchedule/src/main/java/com/iformall/schedule/OrderExpiringSchedule.java +++ b/mallinkSchedule/src/main/java/com/iformall/schedule/OrderExpiringSchedule.java @@ -174,6 +174,17 @@ public class OrderExpiringSchedule { } }); + //无需查询付款状态的订单-退款,回滚库存 + order.setOrderStatus(EnumOrderStatus.ORDER_STATUS_COOPERATING_SCHEDU_REFUND.getCode()); + wxOrderMapper.selectList(new QueryWrapper(order)).stream().forEach(o -> { + try { + wxOrderService.stockBack(order); + proxy.returnMoney((WxOrder) o); + } catch (Exception e) { + logger.error("参团失败退款失败" + e.getMessage()); + } + }); + } @@ -208,7 +219,7 @@ public class OrderExpiringSchedule { int status = WxPayOrderServiceHelper.getPayStatusFromMap(retMap, wxpayOrder.getPayOrderNo()); //如果是支付成功,则更新信息 if (EnumPayStatus.PAY_STATUS_SUCCESS.getCode() == status) { - wxPayOrderService.handleSuccessOrder(wxpayOrder, order, retMap); + wxPayOrderService.handleSuccessOrder(wxpayOrder, order, retMap,true); return true; } return false; diff --git a/mallinkService/src/main/java/com/iformall/enums/EnumOrderStatus.java b/mallinkService/src/main/java/com/iformall/enums/EnumOrderStatus.java index 01776f5b7..d3dce2f12 100644 --- a/mallinkService/src/main/java/com/iformall/enums/EnumOrderStatus.java +++ b/mallinkService/src/main/java/com/iformall/enums/EnumOrderStatus.java @@ -23,9 +23,9 @@ public enum EnumOrderStatus { ORDER_STATUS_COOPERATING_CANCEL(13, "拼团失败"), ORDER_STATUS_COOPERATING_FAILD(14, "参团失败"), ORDER_STATUS_COOPERATING_UNPAID(15, "拼团待付款"),//占库存 - ORDER_STATUS_COOPERATING_BREAK(16, "拼团取消") + ORDER_STATUS_COOPERATING_BREAK(16, "拼团取消"), + ORDER_STATUS_COOPERATING_SCHEDU_REFUND(99,"订单定时状态-需要返款和回滚库存,无需再次查询真实支付状态") ; - public static EnumOrderStatus getEnum(Integer code) { for (EnumOrderStatus value : values()) { if (value.getCode().equals(code)) { diff --git a/mallinkService/src/main/java/com/iformall/service/WxOrderGroupService.java b/mallinkService/src/main/java/com/iformall/service/WxOrderGroupService.java index 21682b5de..ee3314651 100644 --- a/mallinkService/src/main/java/com/iformall/service/WxOrderGroupService.java +++ b/mallinkService/src/main/java/com/iformall/service/WxOrderGroupService.java @@ -15,7 +15,7 @@ import java.util.Map; */ public interface WxOrderGroupService { - void createOrderGroup(WxOrder order, WxCoupon wxCoupon); + void createOrderGroup(WxOrder order, WxCoupon wxCoupon,boolean isScheduleTask); ResultData queryRemainOne(WxOrderGroup wxOrderGroup, Long userId); diff --git a/mallinkService/src/main/java/com/iformall/service/WxOrderService.java b/mallinkService/src/main/java/com/iformall/service/WxOrderService.java index 9a62b915a..44488d033 100644 --- a/mallinkService/src/main/java/com/iformall/service/WxOrderService.java +++ b/mallinkService/src/main/java/com/iformall/service/WxOrderService.java @@ -229,5 +229,7 @@ public interface WxOrderService { int countGroupOrder(Long groupId,boolean ignoreUnPay); + + int countUserCouponGroupOrder(Long cuserId,Long couponId); } diff --git a/mallinkService/src/main/java/com/iformall/service/WxPayOrderService.java b/mallinkService/src/main/java/com/iformall/service/WxPayOrderService.java index 967630d27..ec51b4910 100644 --- a/mallinkService/src/main/java/com/iformall/service/WxPayOrderService.java +++ b/mallinkService/src/main/java/com/iformall/service/WxPayOrderService.java @@ -16,7 +16,7 @@ import com.iformall.enums.EnumPayWay; public interface WxPayOrderService { - public void handleSuccessOrder(WxPayOrder oldRecord,WxOrder order,Map retMap); + public void handleSuccessOrder(WxPayOrder oldRecord,WxOrder order,Map retMap,boolean isScheduleTask); public WxPayOrder handleWxOrderQuery(WxPayOrder oldRecord,WxOrder order,WxAppinfo appInfo,WxPayAccount payAccount,IdWorker idworker,boolean repeatPay); diff --git a/mallinkService/src/main/java/com/iformall/service/impl/WxOrderGroupServiceImpl.java b/mallinkService/src/main/java/com/iformall/service/impl/WxOrderGroupServiceImpl.java index c69780404..e4e834320 100644 --- a/mallinkService/src/main/java/com/iformall/service/impl/WxOrderGroupServiceImpl.java +++ b/mallinkService/src/main/java/com/iformall/service/impl/WxOrderGroupServiceImpl.java @@ -96,7 +96,7 @@ public class WxOrderGroupServiceImpl implements WxOrderGroupService { @Override @Transactional(propagation = Propagation.REQUIRED, rollbackFor = {Exception.class}) - public void createOrderGroup(WxOrder order, WxCoupon wxCoupon) { + public void createOrderGroup(WxOrder order, WxCoupon wxCoupon,boolean isScheduleTask) { Long orderGroupId = order.getOrderGroupId(); //查看是否首次拼团,orderGroupId不等于0代表不是首次拼团,因为第二个加入的拼团者肯定有团单号 if (!orderGroupId.equals(0L)) { @@ -110,9 +110,15 @@ public class WxOrderGroupServiceImpl implements WxOrderGroupService { throw new MallinkException(ErrorCode.ORDER_GROUP_COOPERATING_FAILD.getCode(),"WxOrderGroup is null."+orderGroupId); } if(wxOrderGroup.getRemainPeople()<1) { - //错误,更新状态,定时任务会发起退款,回滚库存 - order.setOrderStatus(EnumOrderStatus.ORDER_STATUS_COOPERATING_UNPAID.getCode()); - wxOrderMapper.updateById(order); + //如果是定时任务处理订单时候补程序发现拼团已满,则此时发起退款,回滚库存, 不能设置为未付款,回引起死循环 + if(isScheduleTask) { + //错误,更新状态,定时任务会发起退款,回滚库存 + order.setOrderStatus(EnumOrderStatus.ORDER_STATUS_COOPERATING_SCHEDU_REFUND.getCode()); + wxOrderMapper.updateById(order); + }else { + order.setOrderStatus(EnumOrderStatus.ORDER_STATUS_COOPERATING_UNPAID.getCode()); + wxOrderMapper.updateById(order); + } throw new MallinkException(ErrorCode.ORDER_GROUP_COOPERATING_FAILD.getCode(),"参团人数已满,将稍后退款。"); } diff --git a/mallinkService/src/main/java/com/iformall/service/impl/WxOrderServiceImpl.java b/mallinkService/src/main/java/com/iformall/service/impl/WxOrderServiceImpl.java index 8d7f49451..e2717d9cb 100644 --- a/mallinkService/src/main/java/com/iformall/service/impl/WxOrderServiceImpl.java +++ b/mallinkService/src/main/java/com/iformall/service/impl/WxOrderServiceImpl.java @@ -2304,5 +2304,17 @@ public class WxOrderServiceImpl implements WxOrderService { return wxOrderMapper.countList(query); } + @Override + public int countUserCouponGroupOrder(Long cuserId, Long couponId) { + WxOrder query = new WxOrder(); + query.setCUserId(cuserId); + query.setProductId(couponId); + List statusS = new ArrayList(); + statusS.add(EnumOrderStatus.ORDER_STATUS_COOPERATING.getCode()); + statusS.add(EnumOrderStatus.ORDER_STATUS_COOPERATING_COMPLETE.getCode()); + query.setStatusS(statusS); + return wxOrderMapper.countList(query); + } + } diff --git a/mallinkService/src/main/java/com/iformall/service/impl/WxPayOrderServiceImpl.java b/mallinkService/src/main/java/com/iformall/service/impl/WxPayOrderServiceImpl.java index 8f1bbfc8c..9af2fdf21 100644 --- a/mallinkService/src/main/java/com/iformall/service/impl/WxPayOrderServiceImpl.java +++ b/mallinkService/src/main/java/com/iformall/service/impl/WxPayOrderServiceImpl.java @@ -121,7 +121,7 @@ public class WxPayOrderServiceImpl implements WxPayOrderService { //方法必须为public AopContext.currentProxy() @Transactional(propagation = Propagation.REQUIRED, readOnly = false, rollbackFor = {Exception.class}) @Override - public void handleSuccessOrder(WxPayOrder oldRecord,WxOrder order,Map retMap) { + public void handleSuccessOrder(WxPayOrder oldRecord,WxOrder order,Map retMap,boolean isScheduleTask) { Date curDate = new Date(); if (oldRecord.getPayOrderStatus() != EnumPayStatus.PAY_STATUS_SUCCESS.getCode()) { //因为此处是处理订单支付成功了但是订单状态为未支付成功的异常状态,库存不应该再扣减 @@ -148,7 +148,7 @@ public class WxPayOrderServiceImpl implements WxPayOrderService { if (isOrderGroupCoupon(oldRecord, wxCoupon)) { // 如果是Coupon是拼团, 创建拼团信息, 不创建COUPON_ORDER try { - wxOrderGroupService.createOrderGroup(order, wxCoupon); + wxOrderGroupService.createOrderGroup(order, wxCoupon,isScheduleTask); } catch (Exception e) { logger.error("参团失败" + e.getMessage()); order.setOrderStatus(EnumOrderStatus.ORDER_STATUS_COOPERATING_FAILD.getCode()); @@ -189,7 +189,7 @@ public class WxPayOrderServiceImpl implements WxPayOrderService { if (EnumPayStatus.PAY_STATUS_SUCCESS.getCode()==wxpaystatus) { //直接调用不会触发事务,spring事务基于AOP代理 WxPayOrderServiceImpl proxy = (WxPayOrderServiceImpl) AopContext.currentProxy(); - proxy.handleSuccessOrder(oldRecord,order,retMap); + proxy.handleSuccessOrder(oldRecord,order,retMap,false); throw new MallinkException(ErrorCode.PAY_ORDER_EXIST.getCode(),"该订单已经支付,请勿重复支付!"); }else if (EnumPayStatus.PAY_STATUS_REFUND.getCode()==wxpaystatus) { throw new MallinkException(ErrorCode.PAY_ORDER_REFUND.getCode(),"该订单已经退款,无法支付!"); @@ -1384,7 +1384,7 @@ public class WxPayOrderServiceImpl implements WxPayOrderService { if (isOrderGroupCoupon(record, wxCoupon)) { // 如果是Coupon是拼团, 创建拼团信息, 不创建COUPON_ORDER try { - wxOrderGroupService.createOrderGroup(order, wxCoupon); + wxOrderGroupService.createOrderGroup(order, wxCoupon,false); } catch (Exception e) { logger.error("参团失败" + e.getMessage()); order.setOrderStatus(EnumOrderStatus.ORDER_STATUS_COOPERATING_FAILD.getCode());