Compare commits

..

3 Commits

Author SHA1 Message Date
shi 58cdc3a44b perf(api): 优化会员创建接口并发处理
- 在 ApiMemberController 的 createMember 方法上添加 synchronized 关键字
- 通过添加同步
2025-03-17 18:19:12 +08:00
shi 8a6a70b687 Merge branch 'main' into main-p 2025-03-17 18:17:59 +08:00
shi 98e1e8731a refactor(ff-game): 优化游戏结果状态处理逻辑
- 新增游戏状态判断逻辑,根据结算金额确定游戏结果
- 修改 gameStatus 字段赋值方式,提高代码可读性和维护性
2025-03-17 17:00:44 +08:00
6 changed files with 85 additions and 55 deletions

View File

@ -92,7 +92,7 @@ public class ApiMemberController extends BaseController {
*/
@PostMapping("/create")
@Transactional
public AjaxResult createMember(@Validated @RequestBody MemberCreateApiRequest memberCreateApiRequest) {
public synchronized AjaxResult createMember(@Validated @RequestBody MemberCreateApiRequest memberCreateApiRequest) {
IGamesService iGamesService = gamesService.get(memberCreateApiRequest.getPlatformCode() + Constants.SERVICE);
ApiException.notNull(iGamesService, ErrorCode.PLATFORM_NOT_EXIST.getCode());

View File

@ -6,6 +6,7 @@ import org.hibernate.validator.constraints.Length;
import javax.validation.constraints.NotBlank;
import javax.validation.constraints.NotNull;
import javax.validation.constraints.Pattern;
import java.io.Serializable;
/**
@ -21,6 +22,7 @@ public class MemberCreateApiRequest implements Serializable{
@NotBlank(message = "account不能为空")
@Length(max = 64, message = "account长度不能超过64个字符")
@Pattern(regexp = "^[a-z0-9]+$", message = "account只能包含小写字母和数字")
private String account;
/** 平台编码 */

View File

@ -94,6 +94,6 @@ public interface NGClient {
* @param headerMap
* @return {@link ApiNGResponseDTO }<{@link ApiGameBetRecordPageResponseDTO }>
*/
@Post(url = "server/recordAll")
@Post(url = "server/recordHistory")
ApiNGResponseDTO<ApiGameBetRecordPageResponseDTO> getBetRecordByTime(@JSONBody Map<String, Object> parameters, @Header Map<String, String> headerMap);
}

View File

@ -43,6 +43,10 @@ import javax.annotation.Resource;
import java.math.BigDecimal;
import java.security.SecureRandom;
import java.text.SimpleDateFormat;
import java.time.Instant;
import java.time.ZoneId;
import java.time.ZoneOffset;
import java.time.format.DateTimeFormatter;
import java.util.*;
import java.util.concurrent.TimeUnit;
import java.util.concurrent.atomic.AtomicInteger;
@ -499,6 +503,16 @@ public class GamesPGServiceImpl implements IGamesService {
.build());
String startTime = DateTimeFormatter
.ofPattern("yyyy-MM-dd HH:mm:ss")
.withZone(ZoneId.of("Asia/Shanghai"))
.format(Instant.ofEpochMilli(betRecordByTimeDTO.getStartTime()));
String endTime = DateTimeFormatter
.ofPattern("yyyy-MM-dd HH:mm:ss")
.withZone(ZoneId.of("Asia/Shanghai"))
.format(Instant.ofEpochMilli(betRecordByTimeDTO.getEndTime()));
betRecordByTimeDTO.setAgentId(currencyDTO.getCode());
@ -509,9 +523,11 @@ public class GamesPGServiceImpl implements IGamesService {
paramsMap.put("currency", currencyDTO.getCurrency());
paramsMap.put("pageNo", pageNo);
paramsMap.put("pageSize", pageSize);
paramsMap.put("startTime", startTime);
paramsMap.put("endTime",endTime);
Map<String, String> key = this.getKey(betRecordByTimeDTO);
SleepUtil.sleep(6000);
ApiNGResponseDTO<ApiGameBetRecordPageResponseDTO> betRecordByTime = ngClient.getBetRecordByTime(paramsMap, key);
if (this.getIsSuccess(betRecordByTime.getCode())) {
@ -539,6 +555,9 @@ public class GamesPGServiceImpl implements IGamesService {
paramMap.put("currency", currencyDTO.getCurrency());
paramMap.put("pageNo", pageNoAtomic.get());
paramMap.put("pageSize", pageSize);
paramMap.put("startTime", startTime);
paramMap.put("endTime", endTime);
SleepUtil.sleep(10000);
ApiNGResponseDTO<ApiGameBetRecordPageResponseDTO> betRecordByTimePage = ngClient.getBetRecordByTime(paramMap, key);
data = betRecordByTimePage.getData();
//数据组装

View File

@ -124,7 +124,7 @@ public class MemberServiceImpl implements IMemberService
*/
@Override
public Member selectMemberByGameAccount(String gameAccount) {
return memberMapper.selectMemberByGameAccount(gameAccount);
return memberMapper.selectMemberByGameAccount(gameAccount.toLowerCase());
}
/**

View File

@ -1,6 +1,7 @@
package com.ff.quartz.task;
import com.ff.base.constant.Constants;
import com.ff.base.core.redis.RedisCache;
import com.ff.base.datasource.DynamicDataSourceContextHolder;
import com.ff.base.enums.GamePlatforms;
import com.ff.base.enums.NGPlatforms;
@ -32,6 +33,7 @@ import org.springframework.security.core.parameters.P;
import org.springframework.stereotype.Component;
import org.springframework.transaction.annotation.Transactional;
import org.springframework.util.CollectionUtils;
import org.springframework.util.ObjectUtils;
import javax.annotation.Resource;
import javax.sql.DataSource;
@ -72,6 +74,10 @@ public class GameTask {
@Resource
private IMemberService memberService;
@Resource
private RedisCache redisCache;
/**
*
*/
@ -116,14 +122,17 @@ public class GameTask {
/**
* ngbetting
*
*/
public void insertGameNGBettingDetails() {
public void insertGameNGBettingDetails(Integer backTime) {
try {
//捞取指定分钟前的数据
Long startTime = DateUtils.addOrSubtractMinutes(DateUtils.getNowDate(), backTime);
Long endTime = DateUtils.getNowDate();
BetRecordByTimeDTO betRecordByTimeDTO = new BetRecordByTimeDTO();
betRecordByTimeDTO.setStartTime(startTime);
betRecordByTimeDTO.setEndTime(endTime);
gamesService.get(NGPlatforms.PG.getPlatform() + Constants.SERVICE).getBetRecordByTime(betRecordByTimeDTO);
} catch (Exception e) {
log.error("查询 NG 投注记录失败,错误信息 {}", e);