fix - 用户可能会有多个订单的情况优化。保持订单幂等。

This commit is contained in:
2026-06-03 16:40:06 +08:00
parent 6074da7c87
commit d66010a830
17 changed files with 362 additions and 66 deletions

View File

@@ -3,6 +3,7 @@ package com.sv.api.controller;
import com.enums.EnterEnum;
import com.enums.PayTypeEnum;
import com.sv.dto.BasketEnterResult;
import com.sv.dto.api.BasketballPayResult;
import com.sv.entity.Device;
import com.sv.entity.Order;
import com.sv.entity.Venue;
@@ -204,7 +205,7 @@ public class VenueController extends BaseApiController {
}
/**
* 篮球入场下订单
* 篮球入场下订单(防重复下单)
*/
@RequestMapping(value = "/venue/basketball/pay", method = RequestMethod.POST)
@AccessToken
@@ -219,8 +220,14 @@ public class VenueController extends BaseApiController {
throw new ServiceException("有人正在使用门禁,请稍后再试");
}
Integer memberId = getMemberIdByAccessToken();
BasketballPayResult result = orderService.createEnterVenueOrder(venueId, memberId, enterFlag, PayTypeEnum.WEI_XIN, new BigDecimal(payMoney));
if (result.getPaidFlag()) {
return ResponseDTO.ok().addAttribute("paid_flag", true).addAttribute("order_sn", result.getOrderSn());
}
return ResponseDTO.ok().
addAttribute("pay",orderService.createEnterVenueOrder(venueId, memberId, enterFlag, PayTypeEnum.WEI_XIN, new BigDecimal(payMoney)));
addAttribute("paid_flag", false).
addAttribute("order_sn", result.getOrderSn()).
addAttribute("pay", result.getWechatPayParam());
}
/**

View File

@@ -17,6 +17,7 @@ import com.sv.service.api.MemberService;
import com.sv.service.api.MemberTokenService;
import com.sv.service.common.ApiConstants;
import com.sv.service.common.CaptchaCacheServiceImpl;
import com.sv.service.common.MemberKeyLock;
import com.sv.service.common.OSSClientUtil;
import com.ydd.framework.core.common.utils.ValidationUtils;
import com.ydd.framework.core.entity.enums.DeletedEnum;
@@ -64,6 +65,8 @@ public class LoginRegisterServiceImpl extends BaseServiceImpl {
private OSSClientUtil ossClientUtil;
@Resource
private WechatService wechatService;
@Resource
private MemberKeyLock memberKeyLock;
/**
* 手机号注册
@@ -137,7 +140,7 @@ public class LoginRegisterServiceImpl extends BaseServiceImpl {
public MemberTokenDTO loginWithXcx(String openId){
MemberTokenDTO memberTokenDTO = null;
Integer platformId = PlatformContext.getPlatFormValue();
synchronized (openId.intern()){
synchronized (memberKeyLock.getLock(openId)){
// 判断用户是否注册过,用微信登录过
MemberAuth memberAuth = memberAuthService.findByAuthId(openId);
// 登录过,则直接登录成功
@@ -166,7 +169,7 @@ public class LoginRegisterServiceImpl extends BaseServiceImpl {
throw new ServiceException("token过期");
}
MemberTokenDTO memberTokenDTO = null;
synchronized (openId){
synchronized (memberKeyLock.getLock(memberId)){
// 1.根据openId,查找登录表,是否有记录,无,直接登录,插入信息到登录表
Member member = memberService.findById(memberId);
// memberService.verify(member);
@@ -364,7 +367,7 @@ public class LoginRegisterServiceImpl extends BaseServiceImpl {
String mobile = wechatResult.getPhoneNumber();
MemberTokenDTO memberTokenDTO = null;
synchronized (openId.intern()){
synchronized (memberKeyLock.getLock(openId)){
Member member = memberService.findByMobile(mobile);
if (member == null) {
MemberAuth memberAuth = memberAuthService.findByAuthId(openId);

View File

@@ -0,0 +1,39 @@
package com.sv.wx;
import com.WeiXinApplication;
import com.enums.EnterEnum;
import com.enums.VenueTypeEnum;
import com.sv.entity.Constants;
import com.sv.entity.Venue;
import com.sv.entity.VenueLesson;
import com.sv.mapper.WxConfigMapper;
import com.sv.service.api.VenueLessonService;
import com.sv.service.api.VenueService;
import com.sv.service.api.util.DateUtilCard;
import com.sv.service.common.BarcodeService;
import com.sv.service.message.SendMsg;
import com.sv.service.message.WeiXinSendUtils;
import com.ydd.oms.entity.sys.WxConfig;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.test.context.junit4.SpringRunner;
import org.springframework.util.StringUtils;
import javax.annotation.Resource;
import java.util.List;
@RunWith(SpringRunner.class)
@SpringBootTest(classes={WeiXinApplication.class})
public class MakeBarcodeTest {
@Resource
BarcodeService barcodeService;
@Test
public void testTask(){
barcodeService.newBarcode("123123","2312313123", EnterEnum.ENTER, 1, 1);
}
}

View File

@@ -32,8 +32,8 @@ public class WxServiceTest {
public void refund(){
// wechatPayService.createUnifiedOrder("testlmq20231224",new BigDecimal(0.02),"127.0.0.1","JSAPI", 535);
// 根据orderSn查出对应订单信息
String orderSn = "231231014749545739";
Integer memberId = 535;
String orderSn = "260603140301802382";
Integer memberId = 1;
Order order = orderService.findOrderSn(orderSn,memberId);
if (order == null){
throw new ServiceException(com.sv.exception.api.ExceptionCodeTemplate.ORDER_ERROR);
@@ -49,7 +49,7 @@ public class WxServiceTest {
memberRefund.setOutRefundNo(orderService.createSn());//商户退款单号
memberRefund.setPlatformId(1);
memberRefundMapper.insert(memberRefund);
wechatPayService.refundInputMoney(memberRefund, order.getPrice(), new BigDecimal(0.01));
wechatPayService.refundInputMoney(memberRefund, order.getPrice(), new BigDecimal(0.02));
}