| @@ -84,6 +84,23 @@ public class WxOrderController extends BaseController { | |||||
| return new ResultData(ErrorCode.MEMBER_IS_LOCKED); | 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; | WxCouponCVo wxCouponCVo = null; | ||||
| String key = "cc:" + orderSaveDto.getCouponChannelId(); | String key = "cc:" + orderSaveDto.getCouponChannelId(); | ||||
| @@ -108,7 +125,7 @@ public class WxOrderController extends BaseController { | |||||
| //此处判断是否存在绝对保证库存不超卖的缓存,如果没有,则把当前的库存设置为最大值。如果有,则是后台设置的时候保存的,以那个为准。 | //此处判断是否存在绝对保证库存不超卖的缓存,如果没有,则把当前的库存设置为最大值。如果有,则是后台设置的时候保存的,以那个为准。 | ||||
| boolean hascache = redisLock.hasCouponStockCache(wxCouponCVo.getCouponId()); | boolean hascache = redisLock.hasCouponStockCache(wxCouponCVo.getCouponId()); | ||||
| if (!hascache) { | if (!hascache) { | ||||
| redisLock.setCouponStock(wxCouponCVo.getCouponId(), wxCouponCVo.getRemainInventory()); | |||||
| redisLock.setCouponStock(wxCouponCVo.getCouponId(), coupon.getRemainInventory()); | |||||
| } | } | ||||
| resultData = couponUserCheck(user, wxCouponCVo); | resultData = couponUserCheck(user, wxCouponCVo); | ||||
| @@ -123,15 +140,6 @@ public class WxOrderController extends BaseController { | |||||
| boolean isPress = orderSaveDto.getPress() != null ? orderSaveDto.getPress() : false; | boolean isPress = orderSaveDto.getPress() != null ? orderSaveDto.getPress() : false; | ||||
| try { | 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); | WxOrder order = wxOrderService.saveOrderForCoupon(user, coupon, orderSaveDto, isPress); | ||||
| return new ResultData(order); | return new ResultData(order); | ||||
| } catch (MallinkException e) { | } catch (MallinkException e) { | ||||
| @@ -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()); | int status = WxPayOrderServiceHelper.getPayStatusFromMap(retMap, wxpayOrder.getPayOrderNo()); | ||||
| //如果是支付成功,则更新信息 | //如果是支付成功,则更新信息 | ||||
| if (EnumPayStatus.PAY_STATUS_SUCCESS.getCode() == status) { | if (EnumPayStatus.PAY_STATUS_SUCCESS.getCode() == status) { | ||||
| wxPayOrderService.handleSuccessOrder(wxpayOrder, order, retMap); | |||||
| wxPayOrderService.handleSuccessOrder(wxpayOrder, order, retMap,true); | |||||
| return true; | return true; | ||||
| } | } | ||||
| return false; | return false; | ||||
| @@ -23,9 +23,9 @@ public enum EnumOrderStatus { | |||||
| ORDER_STATUS_COOPERATING_CANCEL(13, "拼团失败"), | ORDER_STATUS_COOPERATING_CANCEL(13, "拼团失败"), | ||||
| ORDER_STATUS_COOPERATING_FAILD(14, "参团失败"), | ORDER_STATUS_COOPERATING_FAILD(14, "参团失败"), | ||||
| ORDER_STATUS_COOPERATING_UNPAID(15, "拼团待付款"),//占库存 | 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) { | public static EnumOrderStatus getEnum(Integer code) { | ||||
| for (EnumOrderStatus value : values()) { | for (EnumOrderStatus value : values()) { | ||||
| if (value.getCode().equals(code)) { | if (value.getCode().equals(code)) { | ||||
| @@ -15,7 +15,7 @@ import java.util.Map; | |||||
| */ | */ | ||||
| public interface WxOrderGroupService { | public interface WxOrderGroupService { | ||||
| void createOrderGroup(WxOrder order, WxCoupon wxCoupon); | |||||
| void createOrderGroup(WxOrder order, WxCoupon wxCoupon,boolean isScheduleTask); | |||||
| ResultData queryRemainOne(WxOrderGroup wxOrderGroup, Long userId); | ResultData queryRemainOne(WxOrderGroup wxOrderGroup, Long userId); | ||||
| @@ -229,5 +229,7 @@ public interface WxOrderService { | |||||
| int countGroupOrder(Long groupId,boolean ignoreUnPay); | int countGroupOrder(Long groupId,boolean ignoreUnPay); | ||||
| int countUserCouponGroupOrder(Long cuserId,Long couponId); | |||||
| } | } | ||||
| @@ -16,7 +16,7 @@ import com.iformall.enums.EnumPayWay; | |||||
| public interface WxPayOrderService { | public interface WxPayOrderService { | ||||
| public void handleSuccessOrder(WxPayOrder oldRecord,WxOrder order,Map<String, String> retMap); | |||||
| public void handleSuccessOrder(WxPayOrder oldRecord,WxOrder order,Map<String, String> retMap,boolean isScheduleTask); | |||||
| public WxPayOrder handleWxOrderQuery(WxPayOrder oldRecord,WxOrder order,WxAppinfo appInfo,WxPayAccount payAccount,IdWorker idworker,boolean repeatPay); | public WxPayOrder handleWxOrderQuery(WxPayOrder oldRecord,WxOrder order,WxAppinfo appInfo,WxPayAccount payAccount,IdWorker idworker,boolean repeatPay); | ||||
| @@ -96,7 +96,7 @@ public class WxOrderGroupServiceImpl implements WxOrderGroupService { | |||||
| @Override | @Override | ||||
| @Transactional(propagation = Propagation.REQUIRED, rollbackFor = {Exception.class}) | @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(); | Long orderGroupId = order.getOrderGroupId(); | ||||
| //查看是否首次拼团,orderGroupId不等于0代表不是首次拼团,因为第二个加入的拼团者肯定有团单号 | //查看是否首次拼团,orderGroupId不等于0代表不是首次拼团,因为第二个加入的拼团者肯定有团单号 | ||||
| if (!orderGroupId.equals(0L)) { | 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); | throw new MallinkException(ErrorCode.ORDER_GROUP_COOPERATING_FAILD.getCode(),"WxOrderGroup is null."+orderGroupId); | ||||
| } | } | ||||
| if(wxOrderGroup.getRemainPeople()<1) { | 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(),"参团人数已满,将稍后退款。"); | throw new MallinkException(ErrorCode.ORDER_GROUP_COOPERATING_FAILD.getCode(),"参团人数已满,将稍后退款。"); | ||||
| } | } | ||||
| @@ -2304,5 +2304,17 @@ public class WxOrderServiceImpl implements WxOrderService { | |||||
| return wxOrderMapper.countList(query); | return wxOrderMapper.countList(query); | ||||
| } | } | ||||
| @Override | |||||
| public int countUserCouponGroupOrder(Long cuserId, Long couponId) { | |||||
| WxOrder query = new WxOrder(); | |||||
| query.setCUserId(cuserId); | |||||
| query.setProductId(couponId); | |||||
| List<Integer> statusS = new ArrayList<Integer>(); | |||||
| statusS.add(EnumOrderStatus.ORDER_STATUS_COOPERATING.getCode()); | |||||
| statusS.add(EnumOrderStatus.ORDER_STATUS_COOPERATING_COMPLETE.getCode()); | |||||
| query.setStatusS(statusS); | |||||
| return wxOrderMapper.countList(query); | |||||
| } | |||||
| } | } | ||||
| @@ -121,7 +121,7 @@ public class WxPayOrderServiceImpl implements WxPayOrderService { | |||||
| //方法必须为public AopContext.currentProxy() | //方法必须为public AopContext.currentProxy() | ||||
| @Transactional(propagation = Propagation.REQUIRED, readOnly = false, rollbackFor = {Exception.class}) | @Transactional(propagation = Propagation.REQUIRED, readOnly = false, rollbackFor = {Exception.class}) | ||||
| @Override | @Override | ||||
| public void handleSuccessOrder(WxPayOrder oldRecord,WxOrder order,Map<String, String> retMap) { | |||||
| public void handleSuccessOrder(WxPayOrder oldRecord,WxOrder order,Map<String, String> retMap,boolean isScheduleTask) { | |||||
| Date curDate = new Date(); | Date curDate = new Date(); | ||||
| if (oldRecord.getPayOrderStatus() != EnumPayStatus.PAY_STATUS_SUCCESS.getCode()) { | if (oldRecord.getPayOrderStatus() != EnumPayStatus.PAY_STATUS_SUCCESS.getCode()) { | ||||
| //因为此处是处理订单支付成功了但是订单状态为未支付成功的异常状态,库存不应该再扣减 | //因为此处是处理订单支付成功了但是订单状态为未支付成功的异常状态,库存不应该再扣减 | ||||
| @@ -148,7 +148,7 @@ public class WxPayOrderServiceImpl implements WxPayOrderService { | |||||
| if (isOrderGroupCoupon(oldRecord, wxCoupon)) { | if (isOrderGroupCoupon(oldRecord, wxCoupon)) { | ||||
| // 如果是Coupon是拼团, 创建拼团信息, 不创建COUPON_ORDER | // 如果是Coupon是拼团, 创建拼团信息, 不创建COUPON_ORDER | ||||
| try { | try { | ||||
| wxOrderGroupService.createOrderGroup(order, wxCoupon); | |||||
| wxOrderGroupService.createOrderGroup(order, wxCoupon,isScheduleTask); | |||||
| } catch (Exception e) { | } catch (Exception e) { | ||||
| logger.error("参团失败" + e.getMessage()); | logger.error("参团失败" + e.getMessage()); | ||||
| order.setOrderStatus(EnumOrderStatus.ORDER_STATUS_COOPERATING_FAILD.getCode()); | order.setOrderStatus(EnumOrderStatus.ORDER_STATUS_COOPERATING_FAILD.getCode()); | ||||
| @@ -189,7 +189,7 @@ public class WxPayOrderServiceImpl implements WxPayOrderService { | |||||
| if (EnumPayStatus.PAY_STATUS_SUCCESS.getCode()==wxpaystatus) { | if (EnumPayStatus.PAY_STATUS_SUCCESS.getCode()==wxpaystatus) { | ||||
| //直接调用不会触发事务,spring事务基于AOP代理 | //直接调用不会触发事务,spring事务基于AOP代理 | ||||
| WxPayOrderServiceImpl proxy = (WxPayOrderServiceImpl) AopContext.currentProxy(); | WxPayOrderServiceImpl proxy = (WxPayOrderServiceImpl) AopContext.currentProxy(); | ||||
| proxy.handleSuccessOrder(oldRecord,order,retMap); | |||||
| proxy.handleSuccessOrder(oldRecord,order,retMap,false); | |||||
| throw new MallinkException(ErrorCode.PAY_ORDER_EXIST.getCode(),"该订单已经支付,请勿重复支付!"); | throw new MallinkException(ErrorCode.PAY_ORDER_EXIST.getCode(),"该订单已经支付,请勿重复支付!"); | ||||
| }else if (EnumPayStatus.PAY_STATUS_REFUND.getCode()==wxpaystatus) { | }else if (EnumPayStatus.PAY_STATUS_REFUND.getCode()==wxpaystatus) { | ||||
| throw new MallinkException(ErrorCode.PAY_ORDER_REFUND.getCode(),"该订单已经退款,无法支付!"); | throw new MallinkException(ErrorCode.PAY_ORDER_REFUND.getCode(),"该订单已经退款,无法支付!"); | ||||
| @@ -1384,7 +1384,7 @@ public class WxPayOrderServiceImpl implements WxPayOrderService { | |||||
| if (isOrderGroupCoupon(record, wxCoupon)) { | if (isOrderGroupCoupon(record, wxCoupon)) { | ||||
| // 如果是Coupon是拼团, 创建拼团信息, 不创建COUPON_ORDER | // 如果是Coupon是拼团, 创建拼团信息, 不创建COUPON_ORDER | ||||
| try { | try { | ||||
| wxOrderGroupService.createOrderGroup(order, wxCoupon); | |||||
| wxOrderGroupService.createOrderGroup(order, wxCoupon,false); | |||||
| } catch (Exception e) { | } catch (Exception e) { | ||||
| logger.error("参团失败" + e.getMessage()); | logger.error("参团失败" + e.getMessage()); | ||||
| order.setOrderStatus(EnumOrderStatus.ORDER_STATUS_COOPERATING_FAILD.getCode()); | order.setOrderStatus(EnumOrderStatus.ORDER_STATUS_COOPERATING_FAILD.getCode()); | ||||