This commit is contained in:
jsowell
2026-05-14 17:12:04 +08:00
parent 61603f56d4
commit fa641a8563
12 changed files with 129 additions and 70 deletions

View File

@@ -70,6 +70,10 @@ import java.util.stream.Collectors;
@Service
public class MemberService {
private static final int MAX_MEMBER_ID_GENERATE_RETRY_TIMES = 20;
private static final int MAX_MEMBER_REGISTER_RETRY_TIMES = 5;
private final Logger log = LoggerFactory.getLogger(this.getClass());
@Autowired
@@ -413,14 +417,21 @@ public class MemberService {
* @return 注册完成后的会员信息
*/
private MemberBasicInfo registerMemberForRegisterAndLoginV2(MemberRegisterAndLoginDTO dto) {
MemberBasicInfo memberBasicInfo = buildNewMemberForRegisterAndLoginV2(dto);
MemberTransactionDTO memberTransactionDTO = buildMemberTransactionForRegisterAndLoginV2(memberBasicInfo, dto.getFirstLevelMerchantId());
try {
transactionService.createMember(memberTransactionDTO);
return memberBasicInfo;
} catch (DuplicateKeyException e) {
return reloadMemberAfterDuplicateKeyForRegisterAndLoginV2(dto);
for (int attempt = 1; attempt <= MAX_MEMBER_REGISTER_RETRY_TIMES; attempt++) {
MemberBasicInfo memberBasicInfo = buildNewMemberForRegisterAndLoginV2(dto);
MemberTransactionDTO memberTransactionDTO = buildMemberTransactionForRegisterAndLoginV2(memberBasicInfo, dto.getFirstLevelMerchantId());
try {
transactionService.createMember(memberTransactionDTO);
return memberBasicInfo;
} catch (DuplicateKeyException e) {
MemberBasicInfo existedMember = reloadMemberAfterDuplicateKeyForRegisterAndLoginV2(dto, memberBasicInfo.getMemberId(), attempt);
if (existedMember != null) {
return existedMember;
}
}
}
log.error("会员注册重试多次后仍失败, phoneNumber:{}, merchantId:{}", dto.getMobileNumber(), dto.getFirstLevelMerchantId());
throw new BusinessException(ReturnCodeEnum.CODE_MEMBER_REGISTER_AND_LOGIN_ERROR);
}
/**
@@ -468,12 +479,14 @@ public class MemberService {
* @param dto 登录/注册入参
* @return 已存在的会员信息
*/
private MemberBasicInfo reloadMemberAfterDuplicateKeyForRegisterAndLoginV2(MemberRegisterAndLoginDTO dto) {
log.warn("会员注册时检测到唯一索引冲突,重新查询已存在的会员, phoneNumber:{}, merchantId:{}", dto.getMobileNumber(), dto.getFirstLevelMerchantId());
private MemberBasicInfo reloadMemberAfterDuplicateKeyForRegisterAndLoginV2(MemberRegisterAndLoginDTO dto, String memberId, int attempt) {
log.warn("会员注册时检测到唯一索引冲突,重新查询已存在的会员, phoneNumber:{}, merchantId:{}, candidateMemberId:{}, attempt:{}",
dto.getMobileNumber(), dto.getFirstLevelMerchantId(), memberId, attempt);
MemberBasicInfo memberBasicInfo = memberBasicInfoService.selectInfoByMobileNumber(dto.getMobileNumber(), dto.getFirstLevelMerchantId());
if (memberBasicInfo == null) {
log.error("唯一索引冲突后重新查询会员信息为空, phoneNumber:{}, merchantId:{}", dto.getMobileNumber(), dto.getFirstLevelMerchantId());
throw new BusinessException(ReturnCodeEnum.CODE_MEMBER_REGISTER_AND_LOGIN_ERROR);
log.warn("唯一索引冲突后未查询到手机号对应会员准备重新生成memberId重试, phoneNumber:{}, merchantId:{}, candidateMemberId:{}, attempt:{}",
dto.getMobileNumber(), dto.getFirstLevelMerchantId(), memberId, attempt);
return null;
}
return memberBasicInfo;
}
@@ -535,14 +548,14 @@ public class MemberService {
}
private String generateNewMemberId() {
while (true) {
for (int attempt = 1; attempt <= MAX_MEMBER_ID_GENERATE_RETRY_TIMES; attempt++) {
String memberId = IdUtils.getMemberId();
// 通过memberId查询是否已经存在
MemberVO memberVO = memberBasicInfoService.queryMemberInfoByMemberId(memberId);
if (memberVO == null) {
if (!memberBasicInfoService.existsByMemberId(memberId)) {
return memberId;
}
log.warn("生成memberId命中已存在记录准备重试, memberId:{}, attempt:{}", memberId, attempt);
}
throw new BusinessException(ReturnCodeEnum.CODE_MEMBER_REGISTER_AND_LOGIN_ERROR);
}
/**

View File

@@ -1594,7 +1594,8 @@ public class TempService {
return ImportMemberBalanceItemResultDTO.success(phone);
} catch (Exception e) {
logger.error("导入会员余额失败, phone:{}, param:{}", phone, JSON.toJSONString(memberBalanceDTO), e);
return ImportMemberBalanceItemResultDTO.fail(phone, e.getMessage());
String errorMessage = e.getClass().getSimpleName() + ": " + e.getMessage();
return ImportMemberBalanceItemResultDTO.fail(phone, errorMessage);
}
}
@@ -1613,6 +1614,8 @@ public class TempService {
// 1. 根据手机号查询万车充会员信息;不存在则静默注册一个属于万车充体系的会员。
MemberBasicInfo memberBasicInfo = findOrCreateJsowellMember(phone);
logger.info("导入会员余额-会员准备完成, phone:{}, memberId:{}, memberMerchantId:{}, balance:{}",
phone, memberBasicInfo.getMemberId(), memberBasicInfo.getMerchantId(), balance);
// 2. 给“南通晨鸣中锦置业有限责任公司”运营商钱包增加本金余额。
increaseMemberWalletBalance(memberBasicInfo.getMemberId(), balance);
@@ -1653,6 +1656,8 @@ public class TempService {
* <p>如果该运营商钱包不存在,现有余额逻辑会自动创建钱包并记录流水。</p>
*/
private void increaseMemberWalletBalance(String memberId, BigDecimal balance) {
logger.info("导入会员余额-开始增加钱包余额, memberId:{}, targetMerchantId:{}, balance:{}",
memberId, NANTONG_CHENMING_WALLET_MERCHANT_ID, balance);
UpdateMemberBalanceDTO updateMemberBalanceDTO = UpdateMemberBalanceDTO.builder()
.memberId(memberId)
.type(MemberWalletEnum.TYPE_IN.getValue())
@@ -1661,6 +1666,8 @@ public class TempService {
.targetMerchantId(NANTONG_CHENMING_WALLET_MERCHANT_ID)
.build();
memberBasicInfoService.updateMemberBalance(updateMemberBalanceDTO);
logger.info("导入会员余额-钱包余额增加完成, memberId:{}, targetMerchantId:{}, balance:{}",
memberId, NANTONG_CHENMING_WALLET_MERCHANT_ID, balance);
}
}