Commit b8c557b5 by huluobin

支付接口加锁。

parent 130c84c4
package com.gogirl.application.order.serve;
import com.github.binarywang.wxpay.bean.notify.WxPayOrderNotifyResult;
import com.github.binarywang.wxpay.bean.order.WxPayMpOrderResult;
import com.github.binarywang.wxpay.exception.WxPayException;
import com.gogirl.domain.market.discount.DiscountConfig;
import com.gogirl.domain.order.serve.OrderManage;
import com.gogirl.domain.user.customer.CustomerBalance;
import com.gogirl.domain.user.customer.CustomerBalanceRecord;
import com.gogirl.shared.member.order.command.BalanceWxPayQuery;
import com.gogirl.shared.member.order.query.UnifiedOrderQuery;
......@@ -62,7 +57,7 @@ public interface PayService {
void balancePosPay(Integer currentCustomerId, Integer orderId);
/**
* 选择支付方式
* 更新选择支付方式
*
* @param orderId
* @param payType
......
......@@ -93,15 +93,16 @@ public class OrderManageServiceImpl extends ServiceImpl<OrderManageMapper, Order
private OrderCommentMapper orderCommentMapper;
@Resource
private OrderCommentLabelMapper orderCommentLabelMapper;
@Resource
private OrderRecordMapper orderRecordMapper;
@Resource
private CustomerMessageMapper customerMessageMapper;
@Resource
private OrderRecordService orderRecordService;
@Resource
private CustomerBalanceMapper customerBalanceMapper;
@Resource
private CustomerBalanceService customerBalanceService;
@Resource
private OrderServeSkuService orderServeSkuService;
@Resource
......@@ -116,6 +117,8 @@ public class OrderManageServiceImpl extends ServiceImpl<OrderManageMapper, Order
private MarketService marketService;
@Resource
private ProducePromotionTimeMapper producePromotionTimeMapper;
@Resource
private CouponService couponService;
@Override
public BigDecimal countSumPay(Integer customerId, Integer departmentId) {
......@@ -455,7 +458,6 @@ public class OrderManageServiceImpl extends ServiceImpl<OrderManageMapper, Order
customer.getRealName());
}
@Override
public void recordOrderServeData(OrderServe param) {
if (param == null || param.getId() == null) {
......@@ -543,9 +545,6 @@ public class OrderManageServiceImpl extends ServiceImpl<OrderManageMapper, Order
}
@Resource
private CouponService couponService;
@Override
public void recordOrderData(Integer orderId, String remark, String userFeedback, String picturePath, String afterSaleIsBuyCard, String afterSaleBuyCardReason) {
......@@ -735,7 +734,6 @@ public class OrderManageServiceImpl extends ServiceImpl<OrderManageMapper, Order
return orderServeList;
}
@Override
public void updateOrderDataIntegrity(OrderManage om) {
......@@ -747,13 +745,9 @@ public class OrderManageServiceImpl extends ServiceImpl<OrderManageMapper, Order
log.info("***美甲师发起收款***,美甲师id: {},订单id: {}", technicianId, orderId);
String payTypeStr;
//获取订单折扣之后的信息
log.info("获取订单信息");
OrderManage orderManage = this.queryOrder(orderId);
if (orderManage.getStatus() == 3 || orderManage.getStatus() == 4) {
throw new RRException("重复请求");
throw new RRException("订单状态异常");
}
Customer customer = customerService.getById(orderManage.getOrderUser());
......@@ -840,11 +834,6 @@ public class OrderManageServiceImpl extends ServiceImpl<OrderManageMapper, Order
}
@Resource
private CustomerBalanceMapper customerBalanceMapper;
@Resource
private CustomerBalanceService customerBalanceService;
@Override
public void notifyBalanceWxPayOrder(WxPayOrderNotifyResult result) {
String wxScheduleOrderNo = result.getOutTradeNo();
......@@ -950,18 +939,23 @@ public class OrderManageServiceImpl extends ServiceImpl<OrderManageMapper, Order
}
@Resource
private CustomerMessageMapper customerMessageMapper;
@Override
public void friendPayOrder(Integer orderId, String phone) {
//1、订单状态检查
OrderManage orderManage = this.queryOrder(orderId);
if (!orderManage.getStatus().equals(OrderManage.STATUS_UN_PAY)) {
throw new RRException("订单状态异常");
}
//2、朋友用户检查
Integer currentCustomerId = SessionUtils.getCustomerToken().getCustomerId();
Customer customer = customerService.selectByPhone(phone);
if (customer == null) {
throw new RRException(500, "用户不存在");
}
//3、发送代付消息
Map<String, Object> params = new HashMap<>();
params.put(CustomerMessage.PARAM_FRIEND_PAY_ORDER_ID, orderId);
params.put(CustomerMessage.PARAM_FRIEND_PAY_CUSTOMER_ID, currentCustomerId);
......@@ -983,19 +977,22 @@ public class OrderManageServiceImpl extends ServiceImpl<OrderManageMapper, Order
//保存消息
customerMessageMapper.insert(customerMessage);
}
}
@Override
public OrderManage queryOrder(Integer id) {
//1、getById
OrderManage orderManage = this.getById(id);
//2、聚合订单详情
return this.aggregateOrderManage(orderManage);
}
@Override
public OrderManage queryOrderByOrderNo(String orderNo) {
//1、根据订单号查询订单
OrderManage orderManage = this.getOne(new LambdaQueryWrapper<OrderManage>()
.eq(OrderManage::getOrderNo, orderNo));
//2、聚合订单详情
return this.aggregateOrderManage(orderManage);
}
......
......@@ -60,9 +60,13 @@ public class PayServiceImpl implements PayService {
@Override
public void consumeBalance(Integer currentCustomerId, Integer orderId) {
//pre、订单状态检测
OrderManage orderManage = orderManageService.queryOrder(orderId);
if (!orderManage.getStatus().equals(OrderManage.STATUS_UN_PAY)) {
throw new RRException("订单状态异常");
}
/*step1.扣除余额*/
/*1、扣除余额*/
ConsumerCommand consumerCmd = ConsumerCommand.builder()
.amount(orderManage.getTotalPaymentAmount().multiply(new BigDecimal(100)).intValue())
.customerId(currentCustomerId)
......@@ -72,7 +76,7 @@ public class PayServiceImpl implements PayService {
.build();
customerBalanceService.consumer(consumerCmd);
/*step2.更新订单*/
/*2、更新订单状态*/
orderManage.setRemark("余额支付");
orderManageService.updateById(orderManage);
......@@ -118,6 +122,9 @@ public class PayServiceImpl implements PayService {
OrderManage orderManage = orderManageService.queryOrder(qry.getOrderId());
if (!orderManage.getStatus().equals(OrderManage.STATUS_UN_PAY)) {
throw new RRException("订单状态异常");
}
WxPayOrderQuery qry2 = WxPayOrderQuery
.builder()
.currentCustomerId(qry.getCustomerId())
......@@ -149,19 +156,23 @@ public class PayServiceImpl implements PayService {
@Override
public WxPayMpOrderResult balanceWxPay(BalanceWxPayQuery qry) throws UnknownHostException, WxPayException {
OrderManage orderManageDTO = orderManageService.queryOrder(qry.getOrderId());
CustomerBalance customerBalance = customerBalanceMapper.selectOne(new LambdaQueryWrapper<CustomerBalance>().eq(CustomerBalance::getCustomerId, orderManageDTO.getOrderUser()));
//1、订单状态检查
OrderManage orderManage = orderManageService.queryOrder(qry.getOrderId());
if (!orderManage.getStatus().equals(OrderManage.STATUS_UN_PAY)) {
throw new RRException("订单状态异常");
}
if (orderManageDTO.getTotalPaymentAmount().multiply(new BigDecimal(100)).intValue() < customerBalance.getBalance()) {
//2、余额检查
CustomerBalance customerBalance = customerBalanceMapper.selectOne(new LambdaQueryWrapper<CustomerBalance>().eq(CustomerBalance::getCustomerId, orderManage.getOrderUser()));
if (orderManage.getTotalPaymentAmount().multiply(new BigDecimal(100)).intValue() < customerBalance.getBalance()) {
throw new RRException("请使用余额支付");
}
BigDecimal leftTotalPaymentAmount = orderManageDTO.getTotalPaymentAmount().subtract(new BigDecimal(customerBalance.getBalance()).divide(new BigDecimal(100), 2, BigDecimal.ROUND_HALF_UP));
//3、微信统一下单
BigDecimal leftTotalPaymentAmount = orderManage.getTotalPaymentAmount().subtract(new BigDecimal(customerBalance.getBalance()).divide(new BigDecimal(100), 2, BigDecimal.ROUND_HALF_UP));
WxPayOrderQuery wxPayOrderQuery = WxPayOrderQuery.builder()
//避免同单不同金额的情况
.orderNo(String.format("%06d", leftTotalPaymentAmount.multiply(new BigDecimal(100)).intValue()).substring(0, 6) + orderManageDTO.getOrderNo())
.orderNo(String.format("%06d", leftTotalPaymentAmount.multiply(new BigDecimal(100)).intValue()).substring(0, 6) + orderManage.getOrderNo())
.currentCustomerId(qry.getCustomerId())
.openid(qry.getOpenid())
.totalPaymentAmount(leftTotalPaymentAmount)
......@@ -187,17 +198,24 @@ public class PayServiceImpl implements PayService {
@Override
public void balancePosPay(Integer currentCustomerId, Integer orderId) {
//1、订单状态检查
OrderManage orderManage = orderManageService.getById(orderId);
if (!orderManage.getStatus().equals(OrderManage.STATUS_UN_PAY)) {
throw new RRException("订单状态异常");
}
//2、余额检查
CustomerBalance customerBalance = customerBalanceMapper.selectOne(new LambdaQueryWrapper<CustomerBalance>().eq(CustomerBalance::getCustomerId, currentCustomerId));
if (orderManage.getTotalPaymentAmount().multiply(new BigDecimal(100)).intValue() < customerBalance.getBalance()) {
throw new RRException("请使用余额支付");
}
//申请余额pos支付
orderManage.setPaymentType(13);
//3、更新订单
//支付类型:请余额pos支付
orderManage.setPaymentType(13);
//多种方式支付字段构建
BigDecimal balanceAmount = new BigDecimal(customerBalance.getBalance()).divide(new BigDecimal(100), 100, BigDecimal.ROUND_HALF_UP);
......@@ -210,20 +228,28 @@ public class PayServiceImpl implements PayService {
//待确认支付
orderManage.setStatus(8);
orderManage.setUpdateTime(new Date());
orderManageService.updateById(orderManage);
}
@Override
public void chosePayType(Integer orderId, Integer payType) {
//1、订单状态检查
OrderManage orderManage = orderManageMapper.selectById(orderId);
if (!orderManage.getStatus().equals(OrderManage.STATUS_UN_PAY)) {
throw new RRException("订单状态异常");
}
//2、更新订单状态
//客户申请pos机支付
if (payType.equals(5)) {
//状态待确认
orderManage.setStatus(OrderManage.STATUS_UN_CONFIRM);
//支付类型状态pos机
orderManage.setPaymentType(OrderManage.PAYMENT_POS);
orderManage.setUpdateTime(new Date());
orderManageMapper.updateById(orderManage);
}
//客户申请团购支付
......@@ -232,8 +258,11 @@ public class PayServiceImpl implements PayService {
orderManage.setStatus(OrderManage.STATUS_UN_CONFIRM);
//支付类型状态pos机
orderManage.setPaymentType(OrderManage.PAYMENT_DZ);
orderManage.setUpdateTime(new Date());
orderManageMapper.updateById(orderManage);
} else {
}
//非法类型
else {
throw new RRException(500, "invalid payType");
}
}
......
......@@ -3,24 +3,15 @@ package com.gogirl.interfaces.xcx;
import com.github.binarywang.wxpay.bean.order.WxPayMpOrderResult;
import com.github.binarywang.wxpay.exception.WxPayException;
import com.github.pagehelper.PageInfo;
import com.gogirl.application.market.DiscountConfigService;
import com.gogirl.application.order.member.IChargeOrderService;
import com.gogirl.application.order.serve.OrderManageService;
import com.gogirl.application.order.serve.PayService;
import com.gogirl.application.store.store.CustomerDepartmentRelevanceService;
import com.gogirl.application.user.customer.CustomerBalanceService;
import com.gogirl.application.user.customer.CustomerService;
import com.gogirl.application.xcx.GogirlTokenService;
import com.gogirl.domain.user.customer.CustomerBalanceRecord;
import com.gogirl.domain.xcx.GogirlToken;
import com.gogirl.infrastructure.common.base.JsonResult;
import com.gogirl.infrastructure.common.exception.RRException;
import com.gogirl.infrastructure.config.property.GogirlProperties;
import com.gogirl.infrastructure.feign.wx.WxPayControllerFeign;
import com.gogirl.infrastructure.mapper.store.store.UserManageMapper;
import com.gogirl.infrastructure.mapper.user.customer.CustomerBalanceMapper;
import com.gogirl.infrastructure.mapper.user.customer.CustomerBalanceRecordMapper;
import com.gogirl.infrastructure.mapper.user.customer.CustomerMessageMapper;
import com.gogirl.infrastructure.util.SessionUtils;
import com.gogirl.infrastructure.util.lock.OrderIdLock;
import com.gogirl.shared.member.order.command.BalanceWxPayQuery;
......@@ -43,37 +34,20 @@ import java.util.Optional;
@Slf4j
public class PayController {
/**
* rpc service
*/
private final WxPayControllerFeign wxPayControllerFeign;
/**
* domain service
*/
private final GogirlTokenService gogirlTokenService;
private final DiscountConfigService discountConfigService;
private final CustomerBalanceService balanceService;
private final CustomerService customerService;
private final OrderManageService orderManageService;
/**
* mapper
*/
private final UserManageMapper userManageMapper;
private final CustomerMessageMapper customerMessageMapper;
/**
* cqrs service
*/
private final PayService payService;
/**
* config
*/
private final GogirlProperties gogirlProperties;
private final OrderManageService orderManageService;
private final CustomerDepartmentRelevanceService customerDepartmentRelevanceService;
private final CustomerBalanceMapper customerBalanceMapper;
private final CustomerBalanceRecordMapper customerBalanceRecordMapper;
@ApiOperation(value = "微信支付预约")
@PostMapping("/customer/pay/unifiedOrder")
......@@ -84,8 +58,14 @@ public class PayController {
String openid = gogirlTokenService.getByToken(token).getOpenid();
UnifiedOrderQuery qry = new UnifiedOrderQuery(currentCustomerId, orderId, openid);
OrderIdLock lock = OrderIdLock.getInsatance();
try {
lock.lock(orderId);
WxPayMpOrderResult result = payService.unifiedOrder(qry);
return JsonResult.success(result);
} finally {
lock.unlock(orderId);
}
}
@ApiOperation(value = "会员卡支付预约订单")
......@@ -96,7 +76,13 @@ public class PayController {
.orElseThrow(() -> new RRException(500, "token不存在"));
log.info("**会员卡支付订单**,会员:{},订单id:{}", currentCustomerId, orderId);
OrderIdLock lock = OrderIdLock.getInsatance();
try {
lock.lock(orderId);
payService.consumeBalance(currentCustomerId, orderId);
} finally {
lock.unlock(orderId);
}
return JsonResult.success();
}
......@@ -107,10 +93,13 @@ public class PayController {
@RequestParam @NotNull Integer payType) {
log.info("*****用户选择支付方式,支付类型{}", payType);
Integer currentCustomerId = Optional.ofNullable(gogirlTokenService.getByToken(token).getCustomerId())
.orElseThrow(() -> new RRException(500, "token不存在"));
OrderIdLock lock = OrderIdLock.getInsatance();
try {
lock.lock(orderId);
payService.chosePayType(orderId, payType);
} finally {
lock.unlock(orderId);
}
return JsonResult.success();
}
......@@ -125,8 +114,14 @@ public class PayController {
String openid = gogirlTokenService.getByToken(token).getOpenid();
BalanceWxPayQuery qry = new BalanceWxPayQuery(currentCustomerId, orderId, openid);
OrderIdLock lock = OrderIdLock.getInsatance();
try {
lock.lock(orderId);
WxPayMpOrderResult result = payService.balanceWxPay(qry);
return JsonResult.success(result);
} finally {
lock.unlock(orderId);
}
}
@ApiOperation(value = "预约订单会员余额和pos支付")
......@@ -137,13 +132,19 @@ public class PayController {
Integer currentCustomerId = Optional.ofNullable(gogirlTokenService.getByToken(token).getCustomerId())
.orElseThrow(() -> new RRException(500, "token不存在"));
log.info("**余额pos支付订单**,会员:{},订单id:{} ", currentCustomerId, orderId);
OrderIdLock lock = OrderIdLock.getInsatance();
try {
lock.lock(orderId);
payService.balancePosPay(currentCustomerId, orderId);
} finally {
lock.unlock(orderId);
}
return JsonResult.success();
}
private final IChargeOrderService chargeOrderService;
@ApiOperation(value = "用户端充值会员卡")
@ApiOperation(value = "用户端充值会员卡")
@PostMapping("/customer/pay/chargeBalance")
public JsonResult<?> customerChargeBalance(@RequestHeader String token,
@RequestParam Integer chargeId) throws UnknownHostException, WxPayException {
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment