package com.hmall.service.impl;
import com.baomidou.mybatisplus.core.toolkit.IdWorker;
import com.baomidou.mybatisplus.core.toolkit.StringUtils;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.hmall.common.exception.BizIllegalException;
import com.hmall.common.utils.BeanUtils;
import com.hmall.common.utils.UserContext;
import com.hmall.domain.dto.PayApplyDTO;
import com.hmall.domain.dto.PayOrderFormDTO;
import com.hmall.domain.po.Order;
import com.hmall.domain.po.PayOrder;
import com.hmall.enums.PayStatus;
import com.hmall.mapper.PayOrderMapper;
import com.hmall.service.IOrderService;
import com.hmall.service.IPayOrderService;
import com.hmall.service.IUserService;
import lombok.RequiredArgsConstructor;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import java.time.LocalDateTime;
/**
* <p>
* 支付订单 服务实现类
* </p>
*
* @author 虎哥
* @since 2023-05-16
*/
@Service
@RequiredArgsConstructor
public class PayOrderServiceImpl extends ServiceImpl<PayOrderMapper, PayOrder> implements IPayOrderService {
private final IUserService userService;
private final IOrderService orderService;
@Override
public String applyPayOrder(PayApplyDTO applyDTO) {
// 1.幂等性校验
PayOrder payOrder = checkIdempotent(applyDTO);
// 2.返回结果
return payOrder.getId().toString();
}
@Override
@Transactional
public void tryPayOrderByBalance(PayOrderFormDTO payOrderFormDTO) {
// 1.查询支付单
PayOrder po = getById(payOrderFormDTO.getId());
// 2.判断状态
if(!PayStatus.WAIT_BUYER_PAY.equalsValue(po.getStatus())){
// 订单不是未支付,状态异常
throw new BizIllegalException("交易已支付或关闭!");
}
// 3.尝试扣减余额
userService.deductMoney(payOrderFormDTO.getPw(), po.getAmount());
// 4.修改支付单状态
boolean success = markPayOrderSuccess(payOrderFormDTO.getId(), LocalDateTime.now());
if (!success) {
throw new BizIllegalException("交易已支付或关闭!");
}
// 5.修改订单状态
Order order = new Order();
order.setId(po.getBizOrderNo());
order.setStatus(2);
order.setPayTime(LocalDateTime.now());
orderService.updateById(order);
}
public boolean markPayOrderSuccess(Long id, LocalDateTime successTime) {
return lambdaUpdate()
.set(PayOrder::getStatus, PayStatus.TRADE_SUCCESS.getValue())
.set(PayOrder::getPaySuccessTime, successTime)
.eq(PayOrder::getId, id)
// 支付状态的乐观锁判断
.in(PayOrder::getStatus, PayStatus.NOT_COMMIT.getValue(), PayStatus.WAIT_BUYER_PAY.getValue())
.update();
}
private PayOrder checkIdempotent(PayApplyDTO applyDTO) {
// 1.首先查询支付单
PayOrder oldOrder = queryByBizOrderNo(applyDTO.getBizOrderNo());
// 2.判断是否存在
if (oldOrder == null) {
// 不存在支付单,说明是第一次,写入新的支付单并返回
PayOrder payOrder = buildPayOrder(applyDTO);
payOrder.setPayOrderNo(IdWorker.getId());
save(payOrder);
return payOrder;
}
// 3.旧单已经存在,判断是否支付成功
if (PayStatus.TRADE_SUCCESS.equalsValue(oldOrder.getStatus())) {
// 已经支付成功,抛出异常
throw new BizIllegalException("订单已经支付!");
}
// 4.旧单已经存在,判断是否已经关闭
if (PayStatus.TRADE_CLOSED.equalsValue(oldOrder.getStatus())) {
// 已经关闭,抛出异常
throw new BizIllegalException("订单已关闭");
}
// 5.旧单已经存在,判断支付渠道是否一致
if (!StringUtils.equals(oldOrder.getPayChannelCode(), applyDTO.getPayChannelCode())) {
// 支付渠道不一致,需要重置数据,然后重新申请支付单
PayOrder payOrder = buildPayOrder(applyDTO);
payOrder.setId(oldOrder.getId());
payOrder.setQrCodeUrl("");
updateById(payOrder);
payOrder.setPayOrderNo(oldOrder.getPayOrderNo());
return payOrder;
}
// 6.旧单已经存在,且可能是未支付或未提交,且支付渠道一致,直接返回旧数据
return oldOrder;
}
private PayOrder buildPayOrder(PayApplyDTO payApplyDTO) {
// 1.数据转换
PayOrder payOrder = BeanUtils.toBean(payApplyDTO, PayOrder.class);
// 2.初始化数据
payOrder.setPayOverTime(LocalDateTime.now().plusMinutes(120L));
payOrder.setStatus(PayStatus.WAIT_BUYER_PAY.getValue());
payOrder.setBizUserId(UserContext.getUser());
return payOrder;
}
public PayOrder queryByBizOrderNo(Long bizOrderNo) {
return lambdaQuery()
.eq(PayOrder::getBizOrderNo, bizOrderNo)
.one();
}
}
没有合适的资源?快使用搜索试试~ 我知道了~
资源推荐
资源详情
资源评论
收起资源包目录
Docker部署SpringBoot项目(jar包+Mysql) (356个子文件)
PayOrder.class 11KB
PayOrderVO.class 10KB
Item.class 9KB
CartServiceImpl.class 8KB
PayOrderServiceImpl.class 8KB
PageDTO.class 7KB
Order.class 7KB
ItemDTO.class 7KB
OrderVO.class 7KB
CookieBuilder.class 7KB
OrderLogistics.class 7KB
CartVO.class 7KB
OrderServiceImpl.class 6KB
OrderDetail.class 6KB
Cart.class 6KB
PageQuery.class 6KB
Address.class 6KB
UserServiceImpl.class 6KB
AddressDTO.class 6KB
CommonExceptionAdvice.class 6KB
User.class 6KB
SearchController.class 5KB
WebUtils.class 5KB
ItemController.class 5KB
PayApplyDTO.class 5KB
CollUtils.class 4KB
R.class 4KB
ItemPageQuery.class 4KB
CartFormDTO.class 4KB
BeanUtils.class 3KB
JwtProperties.class 3KB
OrderFormDTO.class 3KB
LoginFormDTO.class 3KB
UserLoginVO.class 3KB
ItemServiceImpl.class 3KB
CartController.class 3KB
PayOrderFormDTO.class 3KB
AddressController.class 3KB
JwtTool.class 3KB
AuthProperties.class 3KB
MvcConfig.class 3KB
OrderDetailDTO.class 3KB
ItemServiceImplTest.class 2KB
OrderController.class 2KB
PayController.class 2KB
PayApplyDTO$PayApplyDTOBuilder.class 2KB
JsonConfig.class 2KB
UserStatus.class 2KB
PayStatus.class 2KB
PayType.class 2KB
UserController.class 2KB
HelloController.class 2KB
PayOrderFormDTO$PayOrderFormDTOBuilder.class 2KB
MyBatisConfig.class 2KB
PayChannel.class 2KB
LoginInterceptor.class 2KB
SecurityConfig.class 2KB
CommonException.class 1015B
UserContext.class 926B
UnauthorizedException.class 883B
BadRequestException.class 877B
BizIllegalException.class 877B
ForbiddenException.class 874B
DbException.class 853B
HMallApplication.class 806B
OrderLogisticsServiceImpl.class 723B
OrderDetailServiceImpl.class 702B
CartMapper.class 686B
UserMapper.class 682B
AddressServiceImpl.class 674B
ICartService.class 643B
IItemService.class 641B
ItemMapper.class 559B
IPayOrderService.class 542B
IUserService.class 534B
IOrderService.class 503B
IOrderLogisticsService.class 334B
Convert.class 333B
IOrderDetailService.class 325B
OrderLogisticsMapper.class 321B
IAddressService.class 313B
OrderDetailMapper.class 312B
PayOrderMapper.class 303B
AddressMapper.class 300B
OrderMapper.class 294B
Dockerfile 259B
spring.factories 145B
spring.factories 145B
.gitignore 184B
hm-service.iml 14KB
hm-common.iml 12KB
hmall.iml 6KB
hm-service.jar 65.06MB
hm-common-1.0.0.jar 28KB
PayOrderServiceImpl.java 5KB
WebUtils.java 5KB
CartServiceImpl.java 4KB
OrderServiceImpl.java 4KB
UserServiceImpl.java 3KB
CommonExceptionAdvice.java 3KB
共 356 条
- 1
- 2
- 3
- 4
资源评论
.徐十三.
- 粉丝: 873
- 资源: 6
上传资源 快速赚钱
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功