| @@ -1,7 +1,9 @@ | |||||
| package com.iformall.controller; | package com.iformall.controller; | ||||
| import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; | |||||
| import com.github.pagehelper.PageInfo; | import com.github.pagehelper.PageInfo; | ||||
| import com.iformall.common.ErrorCode; | import com.iformall.common.ErrorCode; | ||||
| import com.iformall.common.IdWorker; | |||||
| import com.iformall.common.Result; | import com.iformall.common.Result; | ||||
| import com.iformall.common.ResultData; | import com.iformall.common.ResultData; | ||||
| import com.iformall.domain.dto.OrderComposeSaveDto; | import com.iformall.domain.dto.OrderComposeSaveDto; | ||||
| @@ -14,6 +16,8 @@ import com.iformall.domain.vo.WxOrderCouponVo; | |||||
| import com.iformall.enums.*; | import com.iformall.enums.*; | ||||
| import com.iformall.exception.MallinkException; | import com.iformall.exception.MallinkException; | ||||
| import com.iformall.service.*; | import com.iformall.service.*; | ||||
| import com.iformall.service.order.OrderFactory; | |||||
| import com.iformall.service.order.entity.WxComposeOrder; | |||||
| import com.iformall.utils.Constant; | import com.iformall.utils.Constant; | ||||
| import com.iformall.utils.RedisLock; | import com.iformall.utils.RedisLock; | ||||
| @@ -61,6 +65,15 @@ public class WxOrderController extends BaseController { | |||||
| @Autowired | @Autowired | ||||
| private WxRefundOrderService wxRefundOrderService; | private WxRefundOrderService wxRefundOrderService; | ||||
| @Autowired | |||||
| private WxPayOrderService wxPayOrderService; | |||||
| @Autowired | |||||
| private WxPayAccountService wxPayAccountService; | |||||
| @Autowired | |||||
| private OrderFactory orderFactory; | |||||
| @Autowired | @Autowired | ||||
| @Qualifier("couponDetailRedisTemplate") | @Qualifier("couponDetailRedisTemplate") | ||||
| RedisTemplate<String, WxCouponCVo> cdRedisTemplate; | RedisTemplate<String, WxCouponCVo> cdRedisTemplate; | ||||
| @@ -142,10 +155,37 @@ public class WxOrderController extends BaseController { | |||||
| return new ResultData(ErrorCode.SYS_PARAMETER_NOT_NULL, "orderId: " + orderIdStr + ", e: " + e.getMessage()); | return new ResultData(ErrorCode.SYS_PARAMETER_NOT_NULL, "orderId: " + orderIdStr + ", e: " + e.getMessage()); | ||||
| } | } | ||||
| try { | try { | ||||
| WxOrder order = wxOrderService.getById(orderId,getTenantInfo().getTenantId()); | |||||
| if (order != null) { | |||||
| wxOrderService.updateOrderStatus(order, EnumOrderStatus.ORDER_STATUS_OVERTIME_CANCEL); | |||||
| WxPayOrder porderq = new WxPayOrder(); | |||||
| porderq.updateTenantInfo(getTenantInfo()); | |||||
| porderq.setOrderId(orderId); | |||||
| WxPayOrder payOrder = wxPayOrderService.getByObj(porderq); | |||||
| if (null != payOrder) { | |||||
| WxComposeOrder composeOrder = orderFactory.getOrderAdapterService(payOrder.getComposeOrder()).getComposeOrder(payOrder.getOrderId(), payOrder.getTenantId()); | |||||
| //查询微信订单状态并更新 | |||||
| boolean hasCompleted = wxPayOrderService.hasCompleted(composeOrder,payOrder); | |||||
| if (!hasCompleted) { | |||||
| WxAppinfo appInfo = wxAppinfoService.getCAppInfo(payOrder, EnumPayWay.getEnum(payOrder.getPayVendor()).getPlat()); | |||||
| WxPayAccount payAccount = wxPayAccountService.getById(appInfo.getPayId()); | |||||
| try { | |||||
| WxPayOrder wo = wxPayOrderService.handleWxOrderQuery(payOrder, composeOrder,appInfo, payAccount, IdWorker.get(),false); | |||||
| if (null == wo) { | |||||
| return new ResultData(ErrorCode.PAY_ORDER_ERROR, "查询微信订单支付状态失败,请稍后!"); | |||||
| } | |||||
| }catch(MallinkException e) { | |||||
| if(e.getErrorCode() == ErrorCode.PAY_ORDER_PAYING.getCode()){ | |||||
| return new ResultData(ErrorCode.PAY_ORDER_PAYING, "查询微信订单支付中,请稍后!"); | |||||
| } | |||||
| } | |||||
| } | |||||
| } | } | ||||
| WxBatchOrder batchOrder = new WxBatchOrder(); | |||||
| batchOrder.updateTenantInfo(getTenantInfo()); | |||||
| batchOrder.setId(orderId); | |||||
| wxOrderService.cancelOrderBatchOrder(batchOrder,payOrder); | |||||
| } catch (Exception e) { | } catch (Exception e) { | ||||
| logger.error("取消订单失败: " + e.getMessage()); | logger.error("取消订单失败: " + e.getMessage()); | ||||
| return new ResultData(ErrorCode.ORDER_IS_FAIL.getCode(), "取消订单失败: " + e.getMessage()); | return new ResultData(ErrorCode.ORDER_IS_FAIL.getCode(), "取消订单失败: " + e.getMessage()); | ||||
| @@ -178,7 +178,7 @@ public class WxPayOrderController extends BaseController { | |||||
| payOrder.setPayOrderStatus(status); | payOrder.setPayOrderStatus(status); | ||||
| payOrder.setFailReason(reasonStr); | payOrder.setFailReason(reasonStr); | ||||
| payOrder.updateTenantInfo(getTenantInfo()); | payOrder.updateTenantInfo(getTenantInfo()); | ||||
| payOrder.setPayVendor(EnumPayWay.PAY_WAY_WECHAT.getCode()); | |||||
| payOrder.setPayVendor(getPayWay().getCode()); | |||||
| try { | try { | ||||
| //有价券支付成功 | //有价券支付成功 | ||||
| @@ -197,7 +197,7 @@ public class WxPayOrderController extends BaseController { | |||||
| WxComposeOrder composeOrder = orderFactory.getOrderAdapterService(payOrder.getComposeOrder()).getComposeOrder(payOrder.getOrderId(), payOrder.getTenantId()); | WxComposeOrder composeOrder = orderFactory.getOrderAdapterService(payOrder.getComposeOrder()).getComposeOrder(payOrder.getOrderId(), payOrder.getTenantId()); | ||||
| //查询微信订单状态并更新 | //查询微信订单状态并更新 | ||||
| boolean hasCompleted = hasCompleted(composeOrder,payOrder); | |||||
| boolean hasCompleted = wxPayOrderService.hasCompleted(composeOrder,payOrder); | |||||
| if (hasCompleted) { | if (hasCompleted) { | ||||
| return new ResultData(Result.SUCCESS, "支付状态更新成功", composeOrder); | return new ResultData(Result.SUCCESS, "支付状态更新成功", composeOrder); | ||||
| } | } | ||||
| @@ -237,41 +237,7 @@ public class WxPayOrderController extends BaseController { | |||||
| return new ResultData(ErrorCode.PAY_ORDER_ERROR, "支付状态更新失败3: " + payOrder.toString() + ", e:" + e.getMessage()); | return new ResultData(ErrorCode.PAY_ORDER_ERROR, "支付状态更新失败3: " + payOrder.toString() + ", e:" + e.getMessage()); | ||||
| } | } | ||||
| } | } | ||||
| private boolean hasCompleted(WxComposeOrder composeOrder,WxPayOrder payOrder) { | |||||
| if (EnumComposeOrder.isSingle(composeOrder.getComposeOrderType())) { | |||||
| WxOrder order = composeOrder.getSingleOrder(); | |||||
| if (null == order) { | |||||
| throw new MallinkException(ErrorCode.PAY_ORDER_ERROR.getCode(), "未查询到Order["+payOrder.getOrderId()+"]."); | |||||
| } | |||||
| WxCoupon wxCoupon = wxCouponService.getById(order.getProductId(),order.getTenantId()); | |||||
| if (null == wxCoupon) { | |||||
| throw new MallinkException(ErrorCode.PAY_ORDER_ERROR.getCode(), "未查询到优惠券[orderId:"+payOrder.getOrderId()+"]."); | |||||
| } | |||||
| //拼团的订单,如果查询到是拼团待付款的,则重新查询是否已经真的支付,其他的直接返回订单信息 | |||||
| if (wxPayOrderService.isOrderGroupCoupon(payOrder, wxCoupon)) { | |||||
| if (!order.getOrderStatus().equals(EnumOrderStatus.ORDER_STATUS_COOPERATING_UNPAID.getCode())) { | |||||
| return true; | |||||
| } | |||||
| }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 true; | |||||
| } | |||||
| } | |||||
| }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 true; | |||||
| } | |||||
| } | |||||
| return false; | |||||
| } | |||||
| @ApiOperation("分页列表接口") | @ApiOperation("分页列表接口") | ||||
| @GetMapping("/list") | @GetMapping("/list") | ||||
| @@ -252,4 +252,6 @@ public interface WxOrderService { | |||||
| PageInfo<WxBatchOrder> listBatchOrderAsPage(WxOrder wxOrder, Integer pageNum, Integer pageSize); | PageInfo<WxBatchOrder> listBatchOrderAsPage(WxOrder wxOrder, Integer pageNum, Integer pageSize); | ||||
| WxBatchOrder batchOrderDetail(WxBatchOrder border); | WxBatchOrder batchOrderDetail(WxBatchOrder border); | ||||
| void cancelOrderBatchOrder(WxBatchOrder border,WxPayOrder payOrder); | |||||
| } | } | ||||
| @@ -156,4 +156,5 @@ public interface WxPayOrderService { | |||||
| public boolean isOrderGroupCoupon(WxPayOrder record, WxCoupon wxCoupon); | public boolean isOrderGroupCoupon(WxPayOrder record, WxCoupon wxCoupon); | ||||
| boolean hasCompleted(WxComposeOrder composeOrder, WxPayOrder payOrder); | |||||
| } | } | ||||
| @@ -17,6 +17,7 @@ import javax.servlet.http.HttpServletRequest; | |||||
| import javax.servlet.http.HttpServletResponse; | import javax.servlet.http.HttpServletResponse; | ||||
| import com.google.common.collect.Lists; | import com.google.common.collect.Lists; | ||||
| import com.iformall.common.Result; | |||||
| import com.iformall.domain.po.*; | import com.iformall.domain.po.*; | ||||
| import com.iformall.domain.po.msg.*; | import com.iformall.domain.po.msg.*; | ||||
| import com.iformall.domain.po.tt.TtCUser; | import com.iformall.domain.po.tt.TtCUser; | ||||
| @@ -3407,6 +3408,31 @@ public class WxOrderServiceImpl implements WxOrderService { | |||||
| return wxBatchOrder; | return wxBatchOrder; | ||||
| } | } | ||||
| @Override | |||||
| @Transactional(propagation = Propagation.REQUIRED, readOnly = false, rollbackFor = {Exception.class}) | |||||
| public void cancelOrderBatchOrder(WxBatchOrder border,WxPayOrder payOrder) { | |||||
| WxBatchOrder wxBatchOrder = wxBatchOrderMapper.selectOne(new QueryWrapper<>(border)); | |||||
| if(wxBatchOrder == null){ | |||||
| throw new MallinkException(ErrorCode.ORDER_IS_NOT_FIND); | |||||
| } | |||||
| WxOrder orderq = new WxOrder(); | |||||
| orderq.updateTenantInfo(wxBatchOrder); | |||||
| orderq.setComposeOrderId(wxBatchOrder.getId()); | |||||
| List<WxOrder> orderList = wxOrderMapper.findList(orderq); | |||||
| if(payOrder == null || !EnumPayStatus.PAY_STATUS_SUCCESS.getCode().equals(payOrder.getPayOrderStatus())){ | |||||
| try { | |||||
| for (WxOrder o : orderList) { | |||||
| this.updateOrderStatus(o, EnumOrderStatus.ORDER_STATUS_OVERTIME_CANCEL); | |||||
| } | |||||
| } catch (Exception e) { | |||||
| logger.error(e.getMessage()); | |||||
| throw new MallinkException(ErrorCode.DB_FAIL); | |||||
| } | |||||
| } | |||||
| } | |||||
| private Map<Long,List<WxOrderCouponVo>> getBatchOrderMap(TenantEntity tenantEntity,List<Long> batchOrderIds){ | private Map<Long,List<WxOrderCouponVo>> getBatchOrderMap(TenantEntity tenantEntity,List<Long> batchOrderIds){ | ||||
| WxOrder recordQ = new WxOrder(); | WxOrder recordQ = new WxOrder(); | ||||
| recordQ.updateTenantInfo(tenantEntity); | recordQ.updateTenantInfo(tenantEntity); | ||||
| @@ -945,8 +945,43 @@ public class WxPayOrderServiceImpl implements WxPayOrderService { | |||||
| return wxCoupon.getType().equals(EnumCouponType.COUPON_GROUP.getCode()) && wxCoupon.getSalePrice().equals(record.getPayAmount()); | return wxCoupon.getType().equals(EnumCouponType.COUPON_GROUP.getCode()) && wxCoupon.getSalePrice().equals(record.getPayAmount()); | ||||
| } | } | ||||
| @Override | |||||
| public boolean hasCompleted(WxComposeOrder composeOrder, WxPayOrder payOrder) { | |||||
| if (EnumComposeOrder.isSingle(composeOrder.getComposeOrderType())) { | |||||
| WxOrder order = composeOrder.getSingleOrder(); | |||||
| if (null == order) { | |||||
| throw new MallinkException(ErrorCode.PAY_ORDER_ERROR.getCode(), "未查询到Order["+payOrder.getOrderId()+"]."); | |||||
| } | |||||
| WxCoupon wxCoupon = wxCouponMapper.selectById(order.getProductId(),order.getTenantId()); | |||||
| if (null == wxCoupon) { | |||||
| throw new MallinkException(ErrorCode.PAY_ORDER_ERROR.getCode(), "未查询到优惠券[orderId:"+payOrder.getOrderId()+"]."); | |||||
| } | |||||
| //拼团的订单,如果查询到是拼团待付款的,则重新查询是否已经真的支付,其他的直接返回订单信息 | |||||
| if (this.isOrderGroupCoupon(payOrder, wxCoupon)) { | |||||
| if (!order.getOrderStatus().equals(EnumOrderStatus.ORDER_STATUS_COOPERATING_UNPAID.getCode())) { | |||||
| return true; | |||||
| } | |||||
| }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 true; | |||||
| } | |||||
| } | |||||
| }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 true; | |||||
| } | |||||
| } | |||||
| return false; | |||||
| } | |||||
| @Override | @Override | ||||
| @Transactional(propagation = Propagation.REQUIRED, readOnly = false, rollbackFor = {Exception.class}) | @Transactional(propagation = Propagation.REQUIRED, readOnly = false, rollbackFor = {Exception.class}) | ||||
| public void handleMicroOrderPaySuccess(Object result,String transcationId,EnumPayWay payWay, WxPayOrder record ,WxMerchantBUser user,WxAppinfo appInfo,PayExtraParam params) { | public void handleMicroOrderPaySuccess(Object result,String transcationId,EnumPayWay payWay, WxPayOrder record ,WxMerchantBUser user,WxAppinfo appInfo,PayExtraParam params) { | ||||