| @@ -1,7 +1,9 @@ | |||
| package com.iformall.controller; | |||
| import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; | |||
| import com.github.pagehelper.PageInfo; | |||
| import com.iformall.common.ErrorCode; | |||
| import com.iformall.common.IdWorker; | |||
| import com.iformall.common.Result; | |||
| import com.iformall.common.ResultData; | |||
| import com.iformall.domain.dto.OrderComposeSaveDto; | |||
| @@ -14,6 +16,8 @@ import com.iformall.domain.vo.WxOrderCouponVo; | |||
| import com.iformall.enums.*; | |||
| import com.iformall.exception.MallinkException; | |||
| 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.RedisLock; | |||
| @@ -61,6 +65,15 @@ public class WxOrderController extends BaseController { | |||
| @Autowired | |||
| private WxRefundOrderService wxRefundOrderService; | |||
| @Autowired | |||
| private WxPayOrderService wxPayOrderService; | |||
| @Autowired | |||
| private WxPayAccountService wxPayAccountService; | |||
| @Autowired | |||
| private OrderFactory orderFactory; | |||
| @Autowired | |||
| @Qualifier("couponDetailRedisTemplate") | |||
| 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()); | |||
| } | |||
| 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) { | |||
| logger.error("取消订单失败: " + 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.setFailReason(reasonStr); | |||
| payOrder.updateTenantInfo(getTenantInfo()); | |||
| payOrder.setPayVendor(EnumPayWay.PAY_WAY_WECHAT.getCode()); | |||
| payOrder.setPayVendor(getPayWay().getCode()); | |||
| try { | |||
| //有价券支付成功 | |||
| @@ -197,7 +197,7 @@ public class WxPayOrderController extends BaseController { | |||
| WxComposeOrder composeOrder = orderFactory.getOrderAdapterService(payOrder.getComposeOrder()).getComposeOrder(payOrder.getOrderId(), payOrder.getTenantId()); | |||
| //查询微信订单状态并更新 | |||
| boolean hasCompleted = hasCompleted(composeOrder,payOrder); | |||
| boolean hasCompleted = wxPayOrderService.hasCompleted(composeOrder,payOrder); | |||
| if (hasCompleted) { | |||
| 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()); | |||
| } | |||
| } | |||
| 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("分页列表接口") | |||
| @GetMapping("/list") | |||
| @@ -252,4 +252,6 @@ public interface WxOrderService { | |||
| PageInfo<WxBatchOrder> listBatchOrderAsPage(WxOrder wxOrder, Integer pageNum, Integer pageSize); | |||
| WxBatchOrder batchOrderDetail(WxBatchOrder border); | |||
| void cancelOrderBatchOrder(WxBatchOrder border,WxPayOrder payOrder); | |||
| } | |||
| @@ -156,4 +156,5 @@ public interface WxPayOrderService { | |||
| 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 com.google.common.collect.Lists; | |||
| import com.iformall.common.Result; | |||
| import com.iformall.domain.po.*; | |||
| import com.iformall.domain.po.msg.*; | |||
| import com.iformall.domain.po.tt.TtCUser; | |||
| @@ -3407,6 +3408,31 @@ public class WxOrderServiceImpl implements WxOrderService { | |||
| 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){ | |||
| WxOrder recordQ = new WxOrder(); | |||
| 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()); | |||
| } | |||
| @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 | |||
| @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) { | |||