From 114e4f8b52be2c2cdba50202ec1aef1af176289d Mon Sep 17 00:00:00 2001 From: xiaohanzi Date: Thu, 18 Jun 2020 16:47:36 +0800 Subject: [PATCH] =?UTF-8?q?=E6=9B=B4=E6=96=B0=E5=BA=93=E5=AD=98bug?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../controller/WxPayOrderController.java | 72 +++++++++++------- .../iformall/service/WxOrderGroupService.java | 5 -- .../iformall/service/WxPayOrderService.java | 3 + .../service/impl/WxOrderGroupServiceImpl.java | 76 +++++++------------ .../service/impl/WxPayOrderServiceImpl.java | 7 +- 5 files changed, 78 insertions(+), 85 deletions(-) diff --git a/mallinkCApi/src/main/java/com/iformall/controller/WxPayOrderController.java b/mallinkCApi/src/main/java/com/iformall/controller/WxPayOrderController.java index e8ceb32e8..3e64b4306 100644 --- a/mallinkCApi/src/main/java/com/iformall/controller/WxPayOrderController.java +++ b/mallinkCApi/src/main/java/com/iformall/controller/WxPayOrderController.java @@ -24,15 +24,17 @@ import com.iformall.common.ResultData; import com.iformall.domain.po.WxAppinfo; import com.iformall.domain.po.WxCUser; import com.iformall.domain.po.WxCUserBasicInfo; +import com.iformall.domain.po.WxCoupon; import com.iformall.domain.po.WxOrder; import com.iformall.domain.po.WxPayAccount; import com.iformall.domain.po.WxPayOrder; import com.iformall.enums.EnumCreditLockedStatus; +import com.iformall.enums.EnumOrderStatus; import com.iformall.enums.EnumPayStatus; import com.iformall.enums.EnumPayWay; import com.iformall.exception.MallinkException; import com.iformall.service.WxCUserBasicInfoService; -import com.iformall.service.WxOrderGroupService; +import com.iformall.service.WxCouponService; import com.iformall.service.WxOrderService; import com.iformall.service.WxPayAccountService; import com.iformall.service.WxPayOrderService; @@ -62,8 +64,9 @@ public class WxPayOrderController extends BaseController { private WxPayAccountService wxPayAccountService; @Autowired - private WxOrderGroupService orderGroupService; - + private WxCouponService wxCouponService; + + //@ApiOperation(value = "发起微信小程序支付订单", notes = "{\"orderId\":\"string\"}") @RequestMapping(value = "/create", method = RequestMethod.POST) public ResultData _create(@RequestBody Map paramMap, HttpServletRequest request) throws Exception { @@ -143,8 +146,6 @@ public class WxPayOrderController extends BaseController { payOrder.setPayOrderStatus(status); payOrder.setFailReason(reasonStr); - WxOrder order = null; - try { //有价券支付成功 if (status.equals(EnumPayStatus.PAY_STATUS_SUCCESS.getCode())) { @@ -158,34 +159,47 @@ public class WxPayOrderController extends BaseController { if (null == payOrder) { return new ResultData(ErrorCode.PAY_ORDER_ERROR, "未查询到payOrder."); } - if (payOrder.getPayOrderStatus().equals(EnumPayStatus.PAY_STATUS_SUCCESS.getCode())) { - order = wxOrderService.getById(orderId); - //如果是拼团,需要处理拼团状态和人数 - if(order.getOrderGroupId() != null && !order.getOrderGroupId().equals(0L)) { - orderGroupService.afterPaySuccessUpdate(order); - } - return new ResultData(Result.SUCCESS, "支付状态更新成功", order); - } else{ - //查询微信订单状态并更新 - WxCUser user = getUser(); - WxAppinfo appInfo = getAppInfo(user.getAppId()); - if (null == appInfo) { - return new ResultData(ErrorCode.PAY_ORDER_ERROR, "当前用户appId["+user.getAppId()+"]找不到appInfo"); + WxOrder order = wxOrderService.getById(orderId); + if (null == order) { + return new ResultData(ErrorCode.PAY_ORDER_ERROR, "未查询到Order["+orderId+"]."); + } + WxCoupon wxCoupon = wxCouponService.getById(order.getProductId()); + if (null == wxCoupon) { + return new ResultData(ErrorCode.PAY_ORDER_ERROR, "未查询到优惠券[orderId:"+orderId+"]."); + } + + //拼团的订单,如果查询到是拼团待付款的,则重新查询是否已经真的支付,其他的直接返回订单信息 + if (wxPayOrderService.isOrderGroupCoupon(payOrder, wxCoupon)) { + if (order.getOrderStatus()!=EnumOrderStatus.ORDER_STATUS_COOPERATING_UNPAID.getCode()) { + return new ResultData(Result.SUCCESS, "支付状态更新成功", order); } - WxPayAccount payAccount = wxPayAccountService.getById(appInfo.getPayId()); - order = wxOrderService.getById(orderId); - try { - WxPayOrder wo = wxPayOrderService.handleWxOrderQuery(payOrder, order, appInfo, payAccount, IdWorker.get(),false); - if (null != wo) { - return new ResultData(Result.SUCCESS, "支付状态更新成功", order); - } - }catch(MallinkException e) { - //已经同步了微信的支付状态,表示已经更新 + }else { + //非拼团的订单,支付成功,关闭订单,撤销支付订单,支付转退款的,直接返回订单信息,其他需要查询真实支付状态 + if (payOrder.getPayOrderStatus().equals(EnumPayStatus.PAY_STATUS_SUCCESS.getCode())|| + payOrder.getPayOrderStatus().equals(EnumPayStatus.PAY_STATUS_CLOSE.getCode())|| + payOrder.getPayOrderStatus().equals(EnumPayStatus.PAY_STATUS_REVERSE.getCode())|| + payOrder.getPayOrderStatus().equals(EnumPayStatus.PAY_STATUS_REFUND.getCode())) { + return new ResultData(Result.SUCCESS, "支付状态更新成功", order); + } + } + //查询微信订单状态并更新 + WxCUser user = getUser(); + WxAppinfo appInfo = getAppInfo(user.getAppId()); + if (null == appInfo) { + return new ResultData(ErrorCode.PAY_ORDER_ERROR, "当前用户appId["+user.getAppId()+"]找不到appInfo"); + } + WxPayAccount payAccount = wxPayAccountService.getById(appInfo.getPayId()); + try { + WxPayOrder wo = wxPayOrderService.handleWxOrderQuery(payOrder, order, appInfo, payAccount, IdWorker.get(),false); + if (null != wo) { return new ResultData(Result.SUCCESS, "支付状态更新成功", order); } + }catch(MallinkException e) { + //已经同步了微信的支付状态,表示已经更新 + return new ResultData(Result.SUCCESS, "支付状态更新成功", order); + } - return new ResultData(ErrorCode.PAY_ORDER_ERROR, "查询微信订单支付状态失败,请稍后!"); - } + return new ResultData(ErrorCode.PAY_ORDER_ERROR, "查询微信订单支付状态失败,请稍后!"); } else if (status.equals(EnumPayStatus.PAY_STATUS_FAIL.getCode())) { // 有价券支付失败 wxPayOrderService.handlePayOrderFail(payOrder, EnumPayStatus.PAY_STATUS_FAIL.getCode()); diff --git a/mallinkService/src/main/java/com/iformall/service/WxOrderGroupService.java b/mallinkService/src/main/java/com/iformall/service/WxOrderGroupService.java index c1aaf7ecb..21682b5de 100644 --- a/mallinkService/src/main/java/com/iformall/service/WxOrderGroupService.java +++ b/mallinkService/src/main/java/com/iformall/service/WxOrderGroupService.java @@ -33,9 +33,4 @@ public interface WxOrderGroupService { PageInfo queryOrderGroupMarketingList(WxOrderGroupMarketing marketing, Integer pageNum, Integer pageSize); - /** - * 支付成功之后,更新接口调用 - */ - void afterPaySuccessUpdate(WxOrder order); - } diff --git a/mallinkService/src/main/java/com/iformall/service/WxPayOrderService.java b/mallinkService/src/main/java/com/iformall/service/WxPayOrderService.java index e57ae2645..967630d27 100644 --- a/mallinkService/src/main/java/com/iformall/service/WxPayOrderService.java +++ b/mallinkService/src/main/java/com/iformall/service/WxPayOrderService.java @@ -7,6 +7,7 @@ import com.iformall.common.IdWorker; import com.iformall.common.ResultData; import com.iformall.domain.po.WxAppinfo; import com.iformall.domain.po.WxCUser; +import com.iformall.domain.po.WxCoupon; import com.iformall.domain.po.WxMerchantBUser; import com.iformall.domain.po.WxOrder; import com.iformall.domain.po.WxPayAccount; @@ -144,6 +145,8 @@ public interface WxPayOrderService { * @param id */ void deleteById(Long id); + + public boolean isOrderGroupCoupon(WxPayOrder record, WxCoupon wxCoupon); } 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 e0d299b5b..c69780404 100644 --- a/mallinkService/src/main/java/com/iformall/service/impl/WxOrderGroupServiceImpl.java +++ b/mallinkService/src/main/java/com/iformall/service/impl/WxOrderGroupServiceImpl.java @@ -65,57 +65,33 @@ public class WxOrderGroupServiceImpl implements WxOrderGroupService { @Autowired WxCouponChannelMapper wxCouponChannelMapper; - @Override - public void afterPaySuccessUpdate(WxOrder order) { - // 参与拼团 - WxOrderGroup wxOrderGroup = wxOrderGroupMapper.selectById(order.getOrderGroupId()); - if (null == wxOrderGroup) { - //错误,更新状态,定时任务会发起退款,回滚库存 - order.setOrderStatus(EnumOrderStatus.ORDER_STATUS_COOPERATING_UNPAID.getCode()); - wxOrderMapper.updateById(order); - throw new MallinkException(ErrorCode.ORDER_GROUP_COOPERATING_FAILD.getCode(),"WxOrderGroup is null."+order.getOrderGroupId()); - } - WxCoupon wxCoupon = wxCouponMapper.selectById(order.getProductId()); - if (null == wxCoupon) { - throw new MallinkException(ErrorCode.ORDER_GROUP_COOPERATING_FAILD.getCode(),"WxCoupon is null. orderId:"+order.getId()); - } - if (wxOrderGroup.getStatus() == EnumOrderStatus.ORDER_STATUS_COOPERATING_COMPLETE.getCode()) { - return; - } - int remainPeople = updateOrderGroup(wxOrderGroup,order,wxCoupon); - if (remainPeople == 0) { - actionAfterOrderGroupSuccess(order, order.getOrderGroupId()); - } - } - - private int updateOrderGroup(WxOrderGroup wxOrderGroup,WxOrder order, WxCoupon wxCoupon) { - //锁住人数 - long time = System.currentTimeMillis() + RedisLock.LONG_TIMEOUT; - String timeStr = String.valueOf(time); - boolean grouppeopleLock = redisLock.lock("grouppeopleLock_"+order.getOrderGroupId(), timeStr); - if (!grouppeopleLock) { - throw new MallinkException(ErrorCode.ORDER_GROUP_COOPERATING_FAILD.getCode(),"参团锁定失败,请稍后再试。"); - } - //此处拼团数量应从订单总数查询 - int ordercount = wxOrderService.countGroupOrder(order.getOrderGroupId(),true); - Integer remainPeople = wxCoupon.getPressLimitNum()-ordercount; - //Integer remainPeople = wxOrderGroup.getRemainPeople()-1; - wxOrderGroup.setStatus(remainPeople <= 0 ? EnumOrderStatus.ORDER_STATUS_COOPERATING_COMPLETE.getCode() : wxOrderGroup.getStatus()); - wxOrderGroup.setUpdateDate(new Date()); - wxOrderGroup.setRemainPeople(remainPeople); - logger.info("非首次拼团,更新拼团信息, 剩余人数-1"); - int row = wxOrderGroupMapper.updateOrderGroup(wxOrderGroup); - if (row != 1) { - //错误,更新状态,定时任务会发起退款,回滚库存 - order.setOrderStatus(EnumOrderStatus.ORDER_STATUS_COOPERATING_UNPAID.getCode()); - wxOrderMapper.updateById(order); - redisLock.unlock("grouppeopleLock_"+order.getOrderGroupId(), timeStr); - throw new MallinkException(ErrorCode.ORDER_GROUP_COOPERATING_FAILD.getCode(),"参团失败,将稍后退款."); - }else { - redisLock.unlock("grouppeopleLock_"+order.getOrderGroupId(), timeStr); - } - return remainPeople; + //锁住人数 + long time = System.currentTimeMillis() + RedisLock.LONG_TIMEOUT; + String timeStr = String.valueOf(time); + boolean grouppeopleLock = redisLock.lock("grouppeopleLock_"+order.getOrderGroupId(), timeStr); + if (!grouppeopleLock) { + throw new MallinkException(ErrorCode.ORDER_GROUP_COOPERATING_FAILD.getCode(),"参团锁定失败,请稍后再试。"); + } + //此处拼团数量应从订单总数查询,支付成功的就算一个,没支付成功的不算 + int ordercount = wxOrderService.countGroupOrder(order.getOrderGroupId(),true); + Integer remainPeople = wxCoupon.getPressLimitNum()-ordercount-1; + //Integer remainPeople = wxOrderGroup.getRemainPeople()-1; + wxOrderGroup.setStatus(remainPeople <= 0 ? EnumOrderStatus.ORDER_STATUS_COOPERATING_COMPLETE.getCode() : wxOrderGroup.getStatus()); + wxOrderGroup.setUpdateDate(new Date()); + wxOrderGroup.setRemainPeople(remainPeople); + logger.info("非首次拼团,更新拼团信息, 剩余人数-1"); + int row = wxOrderGroupMapper.updateOrderGroup(wxOrderGroup); + if (row != 1) { + //错误,更新状态,定时任务会发起退款,回滚库存 + order.setOrderStatus(EnumOrderStatus.ORDER_STATUS_COOPERATING_UNPAID.getCode()); + wxOrderMapper.updateById(order); + redisLock.unlock("grouppeopleLock_"+order.getOrderGroupId(), timeStr); + throw new MallinkException(ErrorCode.ORDER_GROUP_COOPERATING_FAILD.getCode(),"参团失败,将稍后退款."); + }else { + redisLock.unlock("grouppeopleLock_"+order.getOrderGroupId(), timeStr); + } + return remainPeople; } @Override 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 1c6396d77..8f1bbfc8c 100644 --- a/mallinkService/src/main/java/com/iformall/service/impl/WxPayOrderServiceImpl.java +++ b/mallinkService/src/main/java/com/iformall/service/impl/WxPayOrderServiceImpl.java @@ -182,6 +182,10 @@ public class WxPayOrderServiceImpl implements WxPayOrderService { public WxPayOrder handleWxOrderQuery(WxPayOrder oldRecord,WxOrder order,WxAppinfo appInfo,WxPayAccount payAccount,IdWorker idworker,boolean repeatPay) { Map retMap = WxPayOrderServiceHelper.wxOrderPayStatusMap(oldRecord, order, appInfo, payAccount); int wxpaystatus = WxPayOrderServiceHelper.getPayStatusFromMap(retMap, oldRecord.getPayOrderNo()); + //Map retMap = new HashMap(); + //retMap.put("time_end","2020-6-18 10:48:20"); + //retMap.put("transaction_id","asdasdasdasdasd"); + //int wxpaystatus = EnumPayStatus.PAY_STATUS_SUCCESS.getCode(); if (EnumPayStatus.PAY_STATUS_SUCCESS.getCode()==wxpaystatus) { //直接调用不会触发事务,spring事务基于AOP代理 WxPayOrderServiceImpl proxy = (WxPayOrderServiceImpl) AopContext.currentProxy(); @@ -1407,7 +1411,8 @@ public class WxPayOrderServiceImpl implements WxPayOrderService { } } - private boolean isOrderGroupCoupon(WxPayOrder record, WxCoupon wxCoupon) { + @Override + public boolean isOrderGroupCoupon(WxPayOrder record, WxCoupon wxCoupon) { return wxCoupon.getType().equals(EnumCouponType.COUPON_GROUP.getCode()) && wxCoupon.getSalePrice().equals(record.getPayAmount()); }