Compare commits
35 Commits
f35179c8bc
...
d2ced1154d
| Author | SHA1 | Date |
|---|---|---|
|
|
d2ced1154d | |
|
|
9352c50a22 | |
|
|
39dcd026c0 | |
|
|
724d5f8f06 | |
|
|
88bdfc9c16 | |
|
|
3236b4ab55 | |
|
|
10c9601bbe | |
|
|
265b626b6e | |
|
|
537b23a420 | |
|
|
0ce67f08ab | |
|
|
9fa259268e | |
|
|
f32794285a | |
|
|
bf955ed14b | |
|
|
fb6138f9a0 | |
|
|
b0c058345d | |
|
|
ff36a40799 | |
|
|
6410c6bb56 | |
|
|
9d88f8e08f | |
|
|
6e1afc61b0 | |
|
|
c45f69fcb2 | |
|
|
59dc248c3e | |
|
|
58becaf578 | |
|
|
8ec1afd875 | |
|
|
b087305ba1 | |
|
|
72810d4d0e | |
|
|
b466e052f1 | |
|
|
0183bad8e7 | |
|
|
d6141bb716 | |
|
|
22de0fc207 | |
|
|
905893df96 | |
|
|
4e5fb79858 | |
|
|
2013a12aee | |
|
|
3ce8dba98f | |
|
|
ebbf2e14a2 | |
|
|
e020b73282 |
|
|
@ -51,7 +51,10 @@ public class CacheConstants {
|
|||
*/
|
||||
public static final String XK_GAMES = "xk_games:";
|
||||
|
||||
|
||||
/**
|
||||
* ae游戏
|
||||
*/
|
||||
public static final String AE_GAMES = "ae_games:";
|
||||
/**
|
||||
* km游戏
|
||||
*/
|
||||
|
|
@ -68,6 +71,11 @@ public class CacheConstants {
|
|||
*/
|
||||
public static final String PG_GAMES = "pg_games:";
|
||||
|
||||
/**
|
||||
* pgt游戏
|
||||
*/
|
||||
public static final String PGT_GAMES = "pgt_games:";
|
||||
|
||||
|
||||
/**
|
||||
* fc游戏
|
||||
|
|
@ -84,11 +92,26 @@ public class CacheConstants {
|
|||
* dg游戏
|
||||
*/
|
||||
public static final String DG_GAMES = "dg_games:";
|
||||
/**
|
||||
* fb体育
|
||||
*/
|
||||
public static final String FB_Sports = "fp_sports:";
|
||||
|
||||
/**
|
||||
* db体育
|
||||
*/
|
||||
public static final String DB_Sports = "db_sports:";
|
||||
/**
|
||||
* pg游戏投注货币
|
||||
*/
|
||||
public static final String PG_GAMES_BET_CURRENCY = "pg_games:bet:currency";
|
||||
|
||||
|
||||
/**
|
||||
* pgt下一个id
|
||||
*/
|
||||
public static final String PGT_NEXT_ID = "pgt_next:id:";
|
||||
|
||||
/**
|
||||
* ae时间从
|
||||
*/
|
||||
|
|
@ -107,6 +130,15 @@ public class CacheConstants {
|
|||
*/
|
||||
public static final String KM_USER_TOKEN = "km:user:token:";
|
||||
|
||||
|
||||
/**
|
||||
* ae时间从
|
||||
*/
|
||||
public static final String SV388_TIME_FROM= "sv388:time:from";
|
||||
|
||||
public static final String SV388_GAMES = "sv388_games:";
|
||||
|
||||
|
||||
}
|
||||
|
||||
|
||||
|
|
|
|||
|
|
@ -20,8 +20,8 @@ public enum ErrorCode {
|
|||
CURRENCY_NOT_EXIST(1004, "游戏平台不支持的货币"),
|
||||
GAME_NOT_EXIST(1005, "游戏不存在"),
|
||||
CURRENCY_EXCHANGE(1006, "不支持币种的汇率"),
|
||||
FREQUENT_INTERFACE_REQUESTS (1007, "接口请求频繁"),
|
||||
BALANCE_TRANSFER_FAILED (1008, "余额转移失败"),
|
||||
FREQUENT_INTERFACE_REQUESTS(1007, "接口请求频繁"),
|
||||
BALANCE_TRANSFER_FAILED(1008, "余额转移失败"),
|
||||
LANG_NOT_EXIST(1009, "游戏平台不支持的语言"),
|
||||
ORDER_NOT_EXIST(1010, "订单不存在"),
|
||||
PLAYERS_ARE_PLAYING(1011, "玩家游玩中"),
|
||||
|
|
@ -30,6 +30,14 @@ public enum ErrorCode {
|
|||
ACCOUNT_NOT_ONLINE(1014, "账号不在线"),
|
||||
FREQUENT_BALANCE_TRANSFER(1015, "当前游戏账号余额转移频繁"),
|
||||
PLATFORM_NOT_METHODS(1016, "游戏平台不支持的方法"),
|
||||
Create_Member_Failure(1017, "创建会员失败"),
|
||||
Transfer_In_Failure(1018, "转入失败"),
|
||||
Transfer_Out_Failure(1019, "转出失败"),
|
||||
Get_Member_Info_Failure(1020, "获取会员信息失败"),
|
||||
Transfer_Not_Exist(1021, "转帐操作不存在"),
|
||||
Get_Url_Failure(1022, "获取URL失败"),
|
||||
Miss_Config(1023, "缺少配置"),
|
||||
DUPLICATE_ORDER_ID (1024, "重复的订单id"),
|
||||
;
|
||||
|
||||
// 获取错误码
|
||||
|
|
|
|||
|
|
@ -0,0 +1,60 @@
|
|||
package com.ff.base.enums;
|
||||
|
||||
|
||||
import lombok.Getter;
|
||||
|
||||
import java.util.Optional;
|
||||
import java.util.stream.Stream;
|
||||
|
||||
|
||||
/**
|
||||
* xkgame类型
|
||||
*
|
||||
* @author shi
|
||||
* @date 2024/11/13
|
||||
*/
|
||||
@Getter
|
||||
public enum FBSportsType {
|
||||
|
||||
Sports("8", 8,"FB体育"),
|
||||
;
|
||||
|
||||
private final String code;
|
||||
private final Integer systemCode;
|
||||
private final String info;
|
||||
FBSportsType(String code, Integer systemCode, String info)
|
||||
{
|
||||
this.code = code;
|
||||
this.systemCode = systemCode;
|
||||
this.info = info;
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* 按代码查找系统
|
||||
*
|
||||
* @param code 代码
|
||||
* @return {@link String }
|
||||
*/
|
||||
public static Integer findSystemByCode(String code) {
|
||||
Optional<Integer> system = Stream.of(FBSportsType.values())
|
||||
.filter(gameType -> gameType.getCode().equals(code))
|
||||
.map(FBSportsType::getSystemCode)
|
||||
.findFirst();
|
||||
return system.orElse(null);
|
||||
}
|
||||
|
||||
/**
|
||||
* 按代码查找信息
|
||||
*
|
||||
* @param code 代码
|
||||
* @return {@link String }
|
||||
*/
|
||||
public static String findInfoByCode(String code) {
|
||||
Optional<String> system = Stream.of(FBSportsType.values())
|
||||
.filter(gameType -> gameType.getCode().equals(code))
|
||||
.map(FBSportsType::getInfo)
|
||||
.findFirst();
|
||||
return system.orElse(null);
|
||||
}
|
||||
}
|
||||
|
|
@ -0,0 +1,34 @@
|
|||
package com.ff.base.enums;
|
||||
|
||||
|
||||
import lombok.AllArgsConstructor;
|
||||
import lombok.Data;
|
||||
import lombok.Getter;
|
||||
|
||||
/**
|
||||
* 游戏交换步骤
|
||||
*
|
||||
* @author shi
|
||||
* @date 2025/04/08
|
||||
*/
|
||||
@Getter
|
||||
@AllArgsConstructor
|
||||
public enum GameExchangeStep {
|
||||
CREATE_ORDER(1, "创建订单"),
|
||||
DEDUCT_BALANCE(2, "转入提前扣租户余额"),
|
||||
PLATFORM_TRANSACTION(3, "平台交易成功"),
|
||||
TENANT_QUOTA_DEDUCTED(4, "转出租户额度增加成功");
|
||||
|
||||
private final Integer code;
|
||||
private final String description;
|
||||
|
||||
// 根据 code 获取对应的枚举
|
||||
public static GameExchangeStep getByCode(int code) {
|
||||
for (GameExchangeStep step : GameExchangeStep.values()) {
|
||||
if (step.getCode() == code) {
|
||||
return step;
|
||||
}
|
||||
}
|
||||
return null;
|
||||
}
|
||||
}
|
||||
|
|
@ -0,0 +1,21 @@
|
|||
package com.ff.base.enums;
|
||||
|
||||
import lombok.AllArgsConstructor;
|
||||
import lombok.Getter;
|
||||
|
||||
/**
|
||||
* 游戏交换步骤状态
|
||||
*
|
||||
* @author shi
|
||||
* @date 2025/04/08
|
||||
*/
|
||||
@Getter
|
||||
@AllArgsConstructor
|
||||
public enum GameExchangeStepStatus {
|
||||
IN_PROGRESS(0, "进行中"),
|
||||
SUCCESS(1, "成功"),
|
||||
FAILURE(2, "失败");
|
||||
|
||||
private final int code;
|
||||
private final String description;
|
||||
}
|
||||
|
|
@ -1,5 +1,7 @@
|
|||
package com.ff.base.enums;
|
||||
|
||||
import com.ff.base.exception.base.ApiException;
|
||||
|
||||
import java.util.ArrayList;
|
||||
import java.util.List;
|
||||
|
||||
|
|
@ -13,8 +15,11 @@ public enum GamePlatforms {
|
|||
DG("DG", "DG"),
|
||||
MT("MT", "美天棋牌"),
|
||||
AE("AE", "AE"),
|
||||
KM("KM", "KM")
|
||||
;
|
||||
KM("KM", "KM"),
|
||||
PGT("PGT", "PGT"),
|
||||
FBSports("FBSports", "FB体育"),
|
||||
SV388("SV388", "SV388真人"),
|
||||
DBSports("DBSports", "DB体育");
|
||||
|
||||
private final String code;
|
||||
private final String info;
|
||||
|
|
@ -24,6 +29,20 @@ public enum GamePlatforms {
|
|||
this.info = info;
|
||||
}
|
||||
|
||||
/**
|
||||
* 通过代码获取
|
||||
*
|
||||
* @param code 代码
|
||||
* @return {@link GamePlatforms }
|
||||
*/
|
||||
public static GamePlatforms getByCode(String code) {
|
||||
for (GamePlatforms platform : GamePlatforms.values()) {
|
||||
if (platform.getCode().equals(code)) {
|
||||
return platform;
|
||||
}
|
||||
}
|
||||
throw new ApiException(ErrorCode.PLATFORM_NOT_EXIST.getCode());
|
||||
}
|
||||
|
||||
public static List<String> getCodes() {
|
||||
List<String> result = new ArrayList<>();
|
||||
|
|
|
|||
|
|
@ -0,0 +1,24 @@
|
|||
package com.ff.base.enums;
|
||||
|
||||
import lombok.AllArgsConstructor;
|
||||
import lombok.Data;
|
||||
import lombok.Getter;
|
||||
|
||||
/**
|
||||
* 完成
|
||||
*
|
||||
* @author shi
|
||||
* @date 2025/04/07
|
||||
*/
|
||||
@Getter
|
||||
@AllArgsConstructor
|
||||
public enum PGTBetStatus {
|
||||
OPEN(1, "打开 或 未结算", "OPEN"),
|
||||
SETTLED(2, "已结算", "SETTLED"),
|
||||
UNSETTLED(1, "未结算", "UNSETTLED"),
|
||||
VOID(3, "作废 或 无效", "VOID");
|
||||
|
||||
private final int code;
|
||||
private final String description;
|
||||
private final String type;
|
||||
}
|
||||
|
|
@ -0,0 +1,43 @@
|
|||
package com.ff.base.enums;
|
||||
|
||||
import lombok.AllArgsConstructor;
|
||||
import lombok.Data;
|
||||
import lombok.Getter;
|
||||
|
||||
import java.util.Optional;
|
||||
import java.util.stream.Stream;
|
||||
|
||||
/**
|
||||
* pgt名称类型
|
||||
*
|
||||
* @author shi
|
||||
* @date 2025/04/07
|
||||
*/
|
||||
@Getter
|
||||
@AllArgsConstructor
|
||||
public enum PGTGameType {
|
||||
EGAMES("EGAMES",1, "游戏老虎机"),
|
||||
LIVECASINO("LIVECASINO",2, "现场赌场"),
|
||||
SPORT("SPORT",8, "体育"),
|
||||
POKER("POKER",2, "扑克"),
|
||||
TRADING("TRADING",1, "贸易");
|
||||
|
||||
// 枚举字段
|
||||
private final String code;
|
||||
private final Integer systemCode;
|
||||
private final String description;
|
||||
|
||||
/**
|
||||
* 按代码查找系统
|
||||
*
|
||||
* @param code 代码
|
||||
* @return {@link Integer }
|
||||
*/
|
||||
public static Integer findSystemByCode(String code) {
|
||||
Optional<Integer> system = Stream.of(PGTGameType.values())
|
||||
.filter(gameType -> gameType.getCode().equals(code))
|
||||
.map(PGTGameType::getSystemCode)
|
||||
.findFirst();
|
||||
return system.orElse(null);
|
||||
}
|
||||
}
|
||||
|
|
@ -0,0 +1,35 @@
|
|||
package com.ff.base.enums;
|
||||
|
||||
import com.dtflys.forest.annotation.Get;
|
||||
import lombok.AllArgsConstructor;
|
||||
import lombok.Data;
|
||||
import lombok.Getter;
|
||||
|
||||
/**
|
||||
* pgtplayout状态
|
||||
*
|
||||
* @author shi
|
||||
* @date 2025/04/07
|
||||
*/
|
||||
@Getter
|
||||
@AllArgsConstructor
|
||||
public enum PGTPayoutStatus {
|
||||
|
||||
LOSE("LOSE", 2, "输"),
|
||||
WIN("WIN",1, "赢"),
|
||||
DRAW("DRAW",3, "平"),
|
||||
UNKNOWN("UNKNOWN",4, "未知");
|
||||
|
||||
private final String code;
|
||||
private final Integer systemCode;
|
||||
private final String description;
|
||||
|
||||
public static PGTPayoutStatus getByCode(String code) {
|
||||
for (PGTPayoutStatus status : PGTPayoutStatus.values()) {
|
||||
if (status.getCode().equals(code)) {
|
||||
return status;
|
||||
}
|
||||
}
|
||||
return UNKNOWN;
|
||||
}
|
||||
}
|
||||
|
|
@ -0,0 +1,25 @@
|
|||
package com.ff.base.enums;
|
||||
|
||||
import com.alibaba.druid.filter.AutoLoad;
|
||||
import lombok.AllArgsConstructor;
|
||||
import lombok.Getter;
|
||||
|
||||
/**
|
||||
* 超时类型
|
||||
*
|
||||
* @author shi
|
||||
* @date 2025/04/09
|
||||
*/
|
||||
@AllArgsConstructor
|
||||
@Getter
|
||||
public enum TimeOutType {
|
||||
GAME_EXCHANGE_MONEY("gameExchangeMoney", "游戏余额转移");
|
||||
/**
|
||||
* 代码
|
||||
*/
|
||||
private final String code;
|
||||
/**
|
||||
* 信息
|
||||
*/
|
||||
private final String info;
|
||||
}
|
||||
|
|
@ -9,7 +9,8 @@ package com.ff.base.enums;
|
|||
*/
|
||||
public enum TransferType {
|
||||
ALL(1, "从游戏商转移额度到平台商(不看amount值,全部转出"),
|
||||
GAMES(2, "从平台商转移额度到游戏商");
|
||||
GAMES(2, "从平台商转移额度到游戏商"),
|
||||
;
|
||||
private final Integer code;
|
||||
private final String info;
|
||||
|
||||
|
|
|
|||
|
|
@ -0,0 +1,21 @@
|
|||
package com.ff.base.enums;
|
||||
|
||||
import lombok.AllArgsConstructor;
|
||||
import lombok.Data;
|
||||
import lombok.Getter;
|
||||
|
||||
/**
|
||||
* 触发类型
|
||||
*
|
||||
* @author shi
|
||||
* @date 2025/04/09
|
||||
*/
|
||||
@Getter
|
||||
@AllArgsConstructor
|
||||
public enum TriggerType {
|
||||
MANUAL(1, "用户调用手动触发"),
|
||||
TIMER(2, "定时器触发");
|
||||
|
||||
private final int code;
|
||||
private final String description;
|
||||
}
|
||||
|
|
@ -2,11 +2,12 @@ package com.ff.base.manager;
|
|||
|
||||
import com.ff.base.utils.Threads;
|
||||
import com.ff.base.utils.spring.SpringUtils;
|
||||
import org.springframework.scheduling.concurrent.ThreadPoolTaskExecutor;
|
||||
|
||||
import java.util.ArrayList;
|
||||
import java.util.List;
|
||||
import java.util.TimerTask;
|
||||
import java.util.concurrent.Callable;
|
||||
import java.util.concurrent.Future;
|
||||
import java.util.concurrent.ScheduledExecutorService;
|
||||
import java.util.concurrent.TimeUnit;
|
||||
import java.util.concurrent.*;
|
||||
|
||||
/**
|
||||
* 异步任务管理器
|
||||
|
|
@ -24,10 +25,33 @@ public class AsyncManager {
|
|||
*/
|
||||
private ScheduledExecutorService executor = SpringUtils.getBean("scheduledExecutorService");
|
||||
|
||||
|
||||
/**
|
||||
* 顺序执行线程池
|
||||
*/
|
||||
private List<ExecutorService> orderedExecutor = new ArrayList<>();
|
||||
/**
|
||||
* 最大线程数
|
||||
*/
|
||||
public static final int MAX_THREAD_COUNT = 16;
|
||||
|
||||
/**
|
||||
* 线程池
|
||||
*/
|
||||
private ThreadPoolTaskExecutor taskExecutor;
|
||||
|
||||
|
||||
|
||||
/**
|
||||
* 单例模式
|
||||
*/
|
||||
private AsyncManager() {
|
||||
for (int i = 0; i < MAX_THREAD_COUNT; i++) {
|
||||
orderedExecutor.add(Executors.newSingleThreadExecutor());
|
||||
}
|
||||
executor = SpringUtils.getBean("scheduledExecutorService");
|
||||
taskExecutor = SpringUtils.getBean("threadPoolTaskExecutor");
|
||||
|
||||
}
|
||||
|
||||
private static AsyncManager me = new AsyncManager();
|
||||
|
|
@ -36,6 +60,22 @@ public class AsyncManager {
|
|||
return me;
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
||||
public void executeOrdered(String key, Runnable task) {
|
||||
|
||||
if (null == key || key.isEmpty()) {
|
||||
taskExecutor.execute(task);
|
||||
return;
|
||||
}
|
||||
|
||||
int hash = key.hashCode();
|
||||
int index = Math.abs(hash % MAX_THREAD_COUNT);
|
||||
orderedExecutor.get(index).execute(task);
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* 执行任务
|
||||
*
|
||||
|
|
|
|||
|
|
@ -38,7 +38,11 @@ public class DateUtils extends org.apache.commons.lang3.time.DateUtils {
|
|||
|
||||
public static String DAY_END_TIME = "23:59:59";
|
||||
|
||||
public static final String ISO_8601_FORMAT= "yyyy-MM-dd'T'HH:mm:ss";
|
||||
public static final String ISO_8601_FORMAT = "yyyy-MM-dd'T'HH:mm:ss";
|
||||
|
||||
|
||||
public static final String ISO_8601_FORMAT_Z = "yyyy-MM-dd'T'HH:mm:ss'Z'";
|
||||
|
||||
|
||||
/**
|
||||
* 获取当前Date型日期
|
||||
|
|
@ -208,8 +212,8 @@ public class DateUtils extends org.apache.commons.lang3.time.DateUtils {
|
|||
* 将时间戳转换为指定格式的时间字符串
|
||||
*
|
||||
* @param timestamp 时间戳(毫秒)
|
||||
* @param format 目标时间格式,例如:yyyy-MM-dd'T'HH:mm:ssXXX
|
||||
* @param timeZone 时区,例如:GMT+8,UTC等
|
||||
* @param format 目标时间格式,例如:yyyy-MM-dd'T'HH:mm:ssXXX
|
||||
* @param timeZone 时区,例如:GMT+8,UTC等
|
||||
* @return 格式化后的时间字符串
|
||||
*/
|
||||
public static String convertTimestampToFormattedDate(long timestamp, String format, String timeZone) {
|
||||
|
|
@ -246,7 +250,6 @@ public class DateUtils extends org.apache.commons.lang3.time.DateUtils {
|
|||
}
|
||||
|
||||
|
||||
|
||||
/**
|
||||
* 增加 LocalDate ==> Date
|
||||
*/
|
||||
|
|
@ -938,4 +941,38 @@ public class DateUtils extends org.apache.commons.lang3.time.DateUtils {
|
|||
public static boolean isBetween(Long value, Long minValue, Long maxValue) {
|
||||
return value >= minValue && value <= maxValue;
|
||||
}
|
||||
|
||||
/**
|
||||
* 将日期字符串转换为指定时区的毫秒时间戳
|
||||
*
|
||||
* @param dateString 日期字符串,格式为 "yyyy-MM-dd'T'HH:mm:ss.SSS"
|
||||
* @param timezone 时区(如 UTC、Asia/Shanghai)
|
||||
* @return 时区下的毫秒时间戳
|
||||
* @throws Exception 日期解析异常
|
||||
*/
|
||||
public static long convertToMillisWithTimezone(String dateString, String timezone) {
|
||||
try {
|
||||
// 设置日期格式
|
||||
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss.SSS");
|
||||
|
||||
// 设置解析时使用的时区
|
||||
sdf.setTimeZone(TimeZone.getTimeZone(timezone));
|
||||
|
||||
// 解析日期字符串为 Date 对象
|
||||
Date date = sdf.parse(dateString);
|
||||
|
||||
// 获取项目默认时区
|
||||
TimeZone defaultTimeZone = TimeZone.getDefault();
|
||||
|
||||
// 使用默认时区的 Calendar 计算
|
||||
Calendar calendar = Calendar.getInstance(defaultTimeZone);
|
||||
calendar.setTime(date);
|
||||
|
||||
// 返回该时区对应的毫秒时间戳
|
||||
return calendar.getTimeInMillis();
|
||||
} catch (Exception e) {
|
||||
return 0;
|
||||
}
|
||||
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -9,7 +9,6 @@ import java.util.concurrent.ThreadLocalRandom;
|
|||
public class NumberUtils {
|
||||
|
||||
|
||||
|
||||
/**
|
||||
* 计算比例
|
||||
*
|
||||
|
|
@ -68,17 +67,13 @@ public class NumberUtils {
|
|||
Random random = new Random();
|
||||
StringBuilder sb = new StringBuilder();
|
||||
|
||||
// 每位字符可以是字母(A-Z, a-z)或数字(0-9)
|
||||
for (int i = 0; i <size ; i++) {
|
||||
int choice = random.nextInt(3);
|
||||
// 每位字符可以是大写字母(A-Z)或数字(0-9)
|
||||
for (int i = 0; i < size; i++) {
|
||||
int choice = random.nextInt(2);
|
||||
if (choice == 0) {
|
||||
// 随机字母(大写或小写)
|
||||
// 随机大写字母
|
||||
char letter = (char) ('A' + random.nextInt(26));
|
||||
sb.append(letter);
|
||||
} else if (choice == 1) {
|
||||
// 随机小写字母
|
||||
char letter = (char) ('a' + random.nextInt(26));
|
||||
sb.append(letter);
|
||||
} else {
|
||||
// 随机数字
|
||||
sb.append(random.nextInt(10));
|
||||
|
|
@ -88,4 +83,5 @@ public class NumberUtils {
|
|||
return sb.toString();
|
||||
}
|
||||
|
||||
|
||||
}
|
||||
|
|
|
|||
|
|
@ -585,12 +585,12 @@ public class StringUtils extends org.apache.commons.lang3.StringUtils {
|
|||
/**
|
||||
* 加后缀
|
||||
*
|
||||
* @param account 账户
|
||||
* @param suffix 后缀
|
||||
* @param code 代码
|
||||
* @param suffix 后缀
|
||||
* @return {@link String }
|
||||
*/
|
||||
public static String addSuffix(String account, String suffix) {
|
||||
return account + suffix;
|
||||
public static String addSuffix(String code, Object suffix) {
|
||||
return code +"_"+ suffix;
|
||||
}
|
||||
|
||||
/**
|
||||
|
|
|
|||
|
|
@ -16,6 +16,11 @@
|
|||
|
||||
|
||||
<dependencies>
|
||||
<!--<dependency>
|
||||
<groupId>org.apache.rocketmq</groupId>
|
||||
<artifactId>rocketmq-spring-boot-starter</artifactId>
|
||||
<version>2.4.10</version> <!– 请检查最新版本 –>
|
||||
</dependency>-->
|
||||
<!-- spring-boot-devtools -->
|
||||
<dependency>
|
||||
<groupId>org.springframework.boot</groupId>
|
||||
|
|
|
|||
|
|
@ -1,6 +1,7 @@
|
|||
package com.ff.api.controller;
|
||||
|
||||
|
||||
import cn.hutool.core.util.IdUtil;
|
||||
import com.ff.annotation.CheckHeader;
|
||||
import com.ff.api.request.*;
|
||||
import com.ff.api.response.*;
|
||||
|
|
@ -8,8 +9,9 @@ import com.ff.base.constant.Constants;
|
|||
import com.ff.base.core.controller.BaseController;
|
||||
import com.ff.base.core.domain.AjaxResult;
|
||||
import com.ff.base.core.page.TableDataInfo;
|
||||
import com.ff.base.enums.ErrorCode;
|
||||
import com.ff.base.enums.*;
|
||||
import com.ff.base.exception.base.ApiException;
|
||||
import com.ff.base.manager.AsyncManager;
|
||||
import com.ff.base.system.domain.TenantSecretKey;
|
||||
import com.ff.base.utils.StringUtils;
|
||||
import com.ff.base.utils.bean.BeanUtils;
|
||||
|
|
@ -18,6 +20,8 @@ import com.ff.common.service.ITenantGameQuotaFlowService;
|
|||
import com.ff.common.service.ITenantGameQuotaService;
|
||||
import com.ff.config.KeyConfig;
|
||||
import com.ff.game.api.IGamesService;
|
||||
import com.ff.game.api.exchange.StepProcessorFactory;
|
||||
import com.ff.game.api.exchange.dto.GameExchangeDTO;
|
||||
import com.ff.game.api.request.*;
|
||||
import com.ff.game.domain.*;
|
||||
import com.ff.game.dto.GameBettingDetailsDTO;
|
||||
|
|
@ -29,8 +33,10 @@ import lombok.Data;
|
|||
import lombok.extern.slf4j.Slf4j;
|
||||
import org.springframework.beans.factory.annotation.Autowired;
|
||||
import org.springframework.beans.factory.annotation.Qualifier;
|
||||
import org.springframework.http.ResponseEntity;
|
||||
import org.springframework.scheduling.concurrent.ThreadPoolTaskExecutor;
|
||||
import org.springframework.transaction.annotation.Transactional;
|
||||
import org.springframework.util.Assert;
|
||||
import org.springframework.util.CollectionUtils;
|
||||
import org.springframework.util.ObjectUtils;
|
||||
import org.springframework.validation.annotation.Validated;
|
||||
|
|
@ -38,12 +44,14 @@ import org.springframework.web.bind.annotation.PostMapping;
|
|||
import org.springframework.web.bind.annotation.RequestBody;
|
||||
import org.springframework.web.bind.annotation.RequestMapping;
|
||||
import org.springframework.web.bind.annotation.RestController;
|
||||
import org.springframework.web.context.request.async.DeferredResult;
|
||||
|
||||
import javax.annotation.Resource;
|
||||
import java.math.BigDecimal;
|
||||
import java.util.ArrayList;
|
||||
import java.util.List;
|
||||
import java.util.Map;
|
||||
import java.util.concurrent.CompletableFuture;
|
||||
|
||||
/**
|
||||
* api控制器
|
||||
|
|
@ -75,9 +83,6 @@ public class ApiGameController extends BaseController {
|
|||
@Resource
|
||||
private ITenantGameQuotaService tenantGameQuotaService;
|
||||
|
||||
@Resource
|
||||
private ITenantGameQuotaFlowService tenantGameQuotaFlowService;
|
||||
|
||||
@Resource
|
||||
private IGameBettingDetailsService gameBettingDetailsService;
|
||||
|
||||
|
|
@ -93,6 +98,10 @@ public class ApiGameController extends BaseController {
|
|||
@Resource
|
||||
private IPlatformService platformService;
|
||||
|
||||
|
||||
@Resource
|
||||
private StepProcessorFactory stepProcessorFactory;
|
||||
|
||||
/**
|
||||
* 列表
|
||||
*
|
||||
|
|
@ -106,15 +115,10 @@ public class ApiGameController extends BaseController {
|
|||
if (null == platform) {
|
||||
continue;
|
||||
}
|
||||
// List<GameSecretKeyCurrencyDTO> gameSecretKeyCurrencies =
|
||||
// gameSecretKeyCurrencyService.findByGameSecretKeyCurrencyDTOList(
|
||||
// GameSecretKeyCurrencyDTO.builder().platformCode(gameResponse.getPlatformCode())
|
||||
// .build()
|
||||
// );
|
||||
// List<String> currencyCode = gameSecretKeyCurrencies.stream().map(GameSecretKeyCurrencyDTO::getSystemCurrency).collect(Collectors.toList());
|
||||
|
||||
List<String> currencyCode = new ArrayList<>(platform.getCurrencyInfo().keySet());
|
||||
gameResponse.setCurrencyCode(currencyCode);
|
||||
|
||||
}
|
||||
return AjaxResult.success(gameResponses);
|
||||
}
|
||||
|
|
@ -129,7 +133,7 @@ public class ApiGameController extends BaseController {
|
|||
@PostMapping("/login")
|
||||
public AjaxResult login(@Validated @RequestBody GameLoginRequest loginRequest) {
|
||||
|
||||
Game game = gameService.selectGameById(loginRequest.getGameId());
|
||||
Game game = gameService.selectGameByGameId(loginRequest.getGameId());
|
||||
ApiException.notNull(game, ErrorCode.GAME_NOT_EXIST.getCode());
|
||||
|
||||
Platform platform = platformService.get(game.getPlatformCode());
|
||||
|
|
@ -154,18 +158,6 @@ public class ApiGameController extends BaseController {
|
|||
String targetLang = platform.getLangInfo().get(loginRequest.getLangCode());
|
||||
ApiException.notNull(targetLang, ErrorCode.LANG_NOT_EXIST.getCode());
|
||||
|
||||
// TenantSecretKey tenantSecretKey = keyConfig.get();
|
||||
// GameSecretKeyCurrencyDTO secretKeyCurrencyDTO = gameSecretKeyCurrencyService.findByGameSecretKeyCurrencyDTO(GameSecretKeyCurrencyDTO.builder()
|
||||
// .platformCode(gamePlatform.getPlatformCode())
|
||||
// .systemCurrency(memberCreateApiRequest.getCurrencyCode()).build());
|
||||
// ApiException.notNull(secretKeyCurrencyDTO, ErrorCode.CURRENCY_NOT_EXIST.getCode());
|
||||
|
||||
// GameSecretKeyLangDTO gameSecretKeyLangDTO = gameSecretKeyLangService.findGameSecretKeyLangDTO(GameSecretKeyLangDTO.builder()
|
||||
// .platformCode(gamePlatform.getPlatformCode())
|
||||
// .systemLangCode(memberCreateApiRequest.getLangCode())
|
||||
// .build());
|
||||
// ApiException.notNull(gameSecretKeyLangDTO, ErrorCode.LANG_NOT_EXIST.getCode());
|
||||
|
||||
|
||||
Member member = memberService.selectMemberByAccount(loginRequest.getAccount(), loginRequest.getCurrencyCode(), platform.getPlatformCode());
|
||||
ApiException.notNull(member, ErrorCode.ACCOUNT_NOT_EXIST.getCode());
|
||||
|
|
@ -201,19 +193,13 @@ public class ApiGameController extends BaseController {
|
|||
* @return {@link AjaxResult }
|
||||
*/
|
||||
@PostMapping("/exchange/balance")
|
||||
@Transactional
|
||||
public AjaxResult exchangeBalance(@Validated @RequestBody GameExchangeBalanceRequest gameExchangeBalanceRequest) {
|
||||
public DeferredResult<AjaxResult> exchangeBalance(@Validated @RequestBody GameExchangeBalanceRequest gameExchangeBalanceRequest) {
|
||||
|
||||
IGamesService iGamesService = gamesService.get(gameExchangeBalanceRequest.getPlatformCode() + Constants.SERVICE);
|
||||
ApiException.notNull(iGamesService, ErrorCode.PLATFORM_NOT_EXIST.getCode());
|
||||
|
||||
TenantSecretKey tenantSecretKey = keyConfig.get();
|
||||
|
||||
// GameSecretKeyCurrencyDTO gameSecretKey = gameSecretKeyCurrencyService.findByGameSecretKeyCurrencyDTO(GameSecretKeyCurrencyDTO.builder()
|
||||
// .platformCode(gameExchangeBalanceRequest.getPlatformCode())
|
||||
// .systemCurrency(gameExchangeBalanceRequest.getCurrencyCode()).build());
|
||||
//
|
||||
// ApiException.notNull(gameSecretKey, ErrorCode.CURRENCY_NOT_EXIST.getCode());
|
||||
|
||||
Platform platform = platformService.get(gameExchangeBalanceRequest.getPlatformCode());
|
||||
ApiException.notNull(platform, ErrorCode.PLATFORM_NOT_EXIST.getCode());
|
||||
|
|
@ -232,47 +218,76 @@ public class ApiGameController extends BaseController {
|
|||
}
|
||||
ApiException.notNull(keyInfo, ErrorCode.CURRENCY_NOT_EXIST.getCode());
|
||||
|
||||
BigDecimal quota = tenantGameQuotaService.gameBalanceExchange(GameBalanceExchange.builder()
|
||||
.platformCode(gameExchangeBalanceRequest.getPlatformCode())
|
||||
.sourceId(gameExchangeBalanceRequest.getOrderId())
|
||||
.currencyCode(gameExchangeBalanceRequest.getCurrencyCode())
|
||||
.currency(targetCurrency)
|
||||
.transferType(gameExchangeBalanceRequest.getTransferType())
|
||||
.amount(gameExchangeBalanceRequest.getAmount())
|
||||
.account(gameExchangeBalanceRequest.getAccount())
|
||||
.tenantKey(tenantSecretKey.getTenantKey())
|
||||
.systemCurrency(gameExchangeBalanceRequest.getCurrencyCode())
|
||||
.agentId(keyInfo.getCode())
|
||||
.agentKey(keyInfo.getKey())
|
||||
|
||||
.build());
|
||||
|
||||
// 获取用户信息
|
||||
Member member = memberService.selectMemberByAccount(gameExchangeBalanceRequest.getAccount(), gameExchangeBalanceRequest.getCurrencyCode(), gameExchangeBalanceRequest.getPlatformCode());
|
||||
ApiException.notNull(member, ErrorCode.ACCOUNT_NOT_EXIST.getCode());
|
||||
|
||||
List<GameExchangeMoney> gameExchangeMonies = gameExchangeMoneyService.selectGameExchangeMoneyList(
|
||||
GameExchangeMoney.builder()
|
||||
.tenantKey(tenantSecretKey.getTenantKey())
|
||||
.orderId(gameExchangeBalanceRequest.getOrderId())
|
||||
.build()
|
||||
);
|
||||
|
||||
//操作第三方额度接口
|
||||
ExchangeTransferMoneyRequestDTO exchangeTransferMoneyRequestDTO = ExchangeTransferMoneyRequestDTO.builder()
|
||||
.agentId(keyInfo.getCode())
|
||||
.agentKey(keyInfo.getKey())
|
||||
.orderId(gameExchangeBalanceRequest.getOrderId())
|
||||
.account(member.getGameAccount())
|
||||
.currency(/*gameSecretKey.getCurrency()*/targetCurrency)
|
||||
ApiException.isTrue(CollectionUtils.isEmpty(gameExchangeMonies), ErrorCode.DUPLICATE_ORDER_ID.getCode());
|
||||
|
||||
|
||||
Long gameExchangeMoneyId = IdUtil.getSnowflakeNextId();
|
||||
GameExchangeDTO exchangeMoney = GameExchangeDTO.builder()
|
||||
.id(gameExchangeMoneyId)
|
||||
.tenantKey(tenantSecretKey.getTenantKey())
|
||||
.quota(quota)
|
||||
.amount(gameExchangeBalanceRequest.getAmount())
|
||||
.transferType(gameExchangeBalanceRequest.getTransferType())
|
||||
.vendor(platform)
|
||||
.keyInfo(keyInfo)
|
||||
.systemCurrency(gameExchangeBalanceRequest.getCurrencyCode())
|
||||
.memberId(member.getId())
|
||||
.gameAccount(member.getGameAccount())
|
||||
.memberAccount(member.getMemberAccount())
|
||||
.exchangeType(gameExchangeBalanceRequest.getTransferType())
|
||||
.currencyCode(gameExchangeBalanceRequest.getCurrencyCode())
|
||||
.orderId(gameExchangeBalanceRequest.getOrderId())
|
||||
.balance(gameExchangeBalanceRequest.getAmount())
|
||||
.triggerType(TriggerType.MANUAL.getCode())
|
||||
.platformCode(gameExchangeBalanceRequest.getPlatformCode()).build();
|
||||
|
||||
.build();
|
||||
Long exchangeTransferId = iGamesService.exchangeTransferByAgentId(exchangeTransferMoneyRequestDTO);
|
||||
GameExchangeMoney gameExchangeMoney = gameExchangeMoneyService.selectGameExchangeMoneyById(exchangeTransferId);
|
||||
GameExchangeBalanceResponse gameExchangeBalanceResponse = new GameExchangeBalanceResponse();
|
||||
BeanUtils.copyProperties(gameExchangeMoney, gameExchangeBalanceResponse);
|
||||
return AjaxResult.success(gameExchangeBalanceResponse);
|
||||
|
||||
//转出设置转出金额为0
|
||||
if (TransferType.ALL.getCode().equals(gameExchangeBalanceRequest.getTransferType())){
|
||||
exchangeMoney.setBalance(BigDecimal.ZERO);
|
||||
}
|
||||
|
||||
|
||||
ExtInfo extInfo = platform.getExtInfo();
|
||||
Long timeout = 5000L;
|
||||
if (extInfo != null) {
|
||||
timeout = extInfo.getTimeout(TimeOutType.GAME_EXCHANGE_MONEY.getCode());
|
||||
}
|
||||
|
||||
|
||||
DeferredResult<AjaxResult> output = new DeferredResult<>(timeout);
|
||||
AsyncManager.me().executeOrdered(
|
||||
exchangeMoney.getOrderId(),
|
||||
() -> {
|
||||
try {
|
||||
stepProcessorFactory.getStepProcessor(GameExchangeStep.CREATE_ORDER).process(exchangeMoney);
|
||||
|
||||
GameExchangeMoney gameExchangeMoney = gameExchangeMoneyService.selectGameExchangeMoneyById(gameExchangeMoneyId);
|
||||
GameExchangeBalanceResponse gameExchangeBalanceResponse = new GameExchangeBalanceResponse();
|
||||
BeanUtils.copyProperties(gameExchangeMoney, gameExchangeBalanceResponse);
|
||||
output.setResult(AjaxResult.success(gameExchangeBalanceResponse));
|
||||
|
||||
} catch (Exception e) {
|
||||
log.error("ApiGameController [exchangeBalance] 余额转移失败 gameExchangeMoneyId {}", gameExchangeMoneyId,e);
|
||||
stepProcessorFactory.getStepProcessor(GameExchangeStep.getByCode(exchangeMoney.getStep())).rollBack(exchangeMoney);
|
||||
output.setErrorResult(AjaxResult.error(ErrorCode.BALANCE_TRANSFER_FAILED.getCode(), ErrorCode.BALANCE_TRANSFER_FAILED.getMessage()));
|
||||
}
|
||||
|
||||
}
|
||||
);
|
||||
// 超时时间处理逻辑
|
||||
output.onTimeout(() -> {
|
||||
GameExchangeMoney gameExchangeMoney = gameExchangeMoneyService.selectGameExchangeMoneyById(gameExchangeMoneyId);
|
||||
GameExchangeBalanceResponse gameExchangeBalanceResponse = new GameExchangeBalanceResponse();
|
||||
BeanUtils.copyProperties(gameExchangeMoney, gameExchangeBalanceResponse);
|
||||
output.setErrorResult(AjaxResult.success(gameExchangeBalanceResponse));
|
||||
});
|
||||
return output;
|
||||
}
|
||||
|
||||
|
||||
|
|
@ -312,11 +327,6 @@ public class ApiGameController extends BaseController {
|
|||
ApiException.notNull(iGamesService, ErrorCode.PLATFORM_NOT_EXIST.getCode());
|
||||
|
||||
|
||||
// TenantSecretKey tenantSecretKey = keyConfig.get();
|
||||
// GameSecretKeyCurrencyDTO gameSecretKey = gameSecretKeyCurrencyService.findByGameSecretKeyCurrencyDTO(GameSecretKeyCurrencyDTO.builder()
|
||||
// .platformCode(gameCreateFreeSpinRequest.getPlatformCode())
|
||||
// .systemCurrency(gameCreateFreeSpinRequest.getCurrencyCode()).build());
|
||||
// ApiException.notNull(gameSecretKey, ErrorCode.CURRENCY_NOT_EXIST.getCode());
|
||||
Platform platform = platformService.get(gameCreateFreeSpinRequest.getPlatformCode());
|
||||
ApiException.notNull(platform, ErrorCode.PLATFORM_NOT_EXIST.getCode());
|
||||
|
||||
|
|
|
|||
|
|
@ -108,13 +108,8 @@ public class ApiMemberController extends BaseController {
|
|||
}
|
||||
}
|
||||
ApiException.notNull(keyInfo, ErrorCode.CURRENCY_NOT_EXIST.getCode());
|
||||
// GameSecretKeyCurrencyDTO gameSecretKey = gameSecretKeyCurrencyService.findByGameSecretKeyCurrencyDTO(GameSecretKeyCurrencyDTO.builder()
|
||||
// .platformCode(memberCreateApiRequest.getPlatformCode())
|
||||
// .systemCurrency(memberCreateApiRequest.getCurrencyCode()).build());
|
||||
|
||||
// ApiException.notNull(gameSecretKey, ErrorCode.CURRENCY_NOT_EXIST.getCode());
|
||||
|
||||
String gameAccount = StringUtils.addSuffix(memberService.getMemberGameAccount(memberCreateApiRequest.getPlatformCode()), tenantSecretKey.getTenantSn());
|
||||
String gameAccount =memberService.getMemberGameAccount(memberCreateApiRequest.getPlatformCode(), tenantSecretKey.getTenantSn());
|
||||
|
||||
|
||||
// 获取用户信息
|
||||
|
|
@ -149,6 +144,10 @@ public class ApiMemberController extends BaseController {
|
|||
.build();
|
||||
Boolean result = iGamesService.createMember(gamesBaseRequestDTO);
|
||||
Assert.isTrue(result, "建立游戏账号失败");
|
||||
|
||||
|
||||
|
||||
|
||||
return toAjax(Boolean.TRUE);
|
||||
|
||||
}
|
||||
|
|
@ -166,12 +165,6 @@ public class ApiMemberController extends BaseController {
|
|||
ApiException.notNull(iGamesService, ErrorCode.PLATFORM_NOT_EXIST.getCode());
|
||||
|
||||
|
||||
TenantSecretKey tenantSecretKey = keyConfig.get();
|
||||
// GameSecretKeyCurrencyDTO gameSecretKey = gameSecretKeyCurrencyService.findByGameSecretKeyCurrencyDTO(GameSecretKeyCurrencyDTO.builder()
|
||||
// .platformCode(memberInfoApiRequest.getPlatformCode())
|
||||
// .systemCurrency(memberInfoApiRequest.getCurrencyCode()).build());
|
||||
//
|
||||
// ApiException.notNull(gameSecretKey, ErrorCode.CURRENCY_NOT_EXIST.getCode());
|
||||
Platform platform = platformService.get(request.getPlatformCode());
|
||||
ApiException.notNull(platform, ErrorCode.PLATFORM_NOT_EXIST.getCode());
|
||||
|
||||
|
|
|
|||
|
|
@ -44,8 +44,8 @@ public class GameLoginRequest implements Serializable {
|
|||
/**
|
||||
* 游戏id
|
||||
*/
|
||||
@NotNull(message = "gameId不能为空")
|
||||
private Long gameId;
|
||||
@NotBlank(message = "gameId不能为空")
|
||||
private String gameId;
|
||||
|
||||
|
||||
/**
|
||||
|
|
|
|||
|
|
@ -1,5 +1,6 @@
|
|||
package com.ff.api.response;
|
||||
|
||||
import com.ff.game.domain.NameInfo;
|
||||
import lombok.AllArgsConstructor;
|
||||
import lombok.Builder;
|
||||
import lombok.Data;
|
||||
|
|
@ -27,7 +28,7 @@ public class GameResponse implements Serializable {
|
|||
/**
|
||||
* 游戏id
|
||||
*/
|
||||
private Long id;
|
||||
private String id;
|
||||
|
||||
/**
|
||||
* 游戏名称
|
||||
|
|
@ -60,5 +61,8 @@ public class GameResponse implements Serializable {
|
|||
* 支持货币代码
|
||||
*/
|
||||
private List<String> currencyCode;
|
||||
|
||||
/**
|
||||
* 名称
|
||||
*/
|
||||
private List<NameInfo> nameInfo;
|
||||
}
|
||||
|
|
|
|||
|
|
@ -47,6 +47,12 @@ public class GameBalanceExchange extends GamesBaseRequestDTO implements Serializ
|
|||
*/
|
||||
private BigDecimal amount;
|
||||
|
||||
|
||||
/**
|
||||
*
|
||||
*/
|
||||
private BigDecimal amountActual;
|
||||
|
||||
/**
|
||||
* 账户
|
||||
*/
|
||||
|
|
@ -61,4 +67,9 @@ public class GameBalanceExchange extends GamesBaseRequestDTO implements Serializ
|
|||
*/
|
||||
private String sourceId;
|
||||
|
||||
/**
|
||||
* 就是全部
|
||||
*/
|
||||
private Boolean isAll;
|
||||
|
||||
}
|
||||
|
|
|
|||
|
|
@ -152,7 +152,7 @@ public class TenantGameQuotaServiceImpl implements ITenantGameQuotaService {
|
|||
BigDecimal balance = balanceChangesDTO.getBalance();
|
||||
//如果有汇率 则需要计算真实扣除额度
|
||||
if (!ObjectUtils.isEmpty(balanceChangesDTO.getActualBalance())) {
|
||||
balance = NumberUtil.div(balance, balanceChangesDTO.getActualBalance(), 2, RoundingMode.FLOOR);
|
||||
balance = NumberUtil.div(balance, balanceChangesDTO.getActualBalance(), 5, RoundingMode.FLOOR);
|
||||
}
|
||||
|
||||
if (BigDecimal.ZERO.compareTo(balance) >= 0) {
|
||||
|
|
@ -222,7 +222,7 @@ public class TenantGameQuotaServiceImpl implements ITenantGameQuotaService {
|
|||
BigDecimal balance = balanceRealChangesDTO.getBalance();
|
||||
//如果有汇率 则需要计算真实扣除额度
|
||||
if (!ObjectUtils.isEmpty(balanceRealChangesDTO.getActualBalance())) {
|
||||
balance = NumberUtil.div(balance, balanceRealChangesDTO.getActualBalance(), 2, RoundingMode.FLOOR);
|
||||
balance = NumberUtil.div(balance, balanceRealChangesDTO.getActualBalance(), 5, RoundingMode.FLOOR);
|
||||
}
|
||||
|
||||
if (BigDecimal.ZERO.compareTo(balance) >= 0) {
|
||||
|
|
@ -271,13 +271,6 @@ public class TenantGameQuotaServiceImpl implements ITenantGameQuotaService {
|
|||
*/
|
||||
@Override
|
||||
public BigDecimal gameBalanceExchange(GameBalanceExchange gameBalanceExchange) {
|
||||
// 获取平台接口密钥
|
||||
// GameSecretKeyCurrencyDTO gameSecretKey = gameSecretKeyCurrencyService.findByGameSecretKeyCurrencyDTO(GameSecretKeyCurrencyDTO.builder()
|
||||
// .platformCode(gameBalanceExchange.getPlatformCode())
|
||||
// .systemCurrency(gameBalanceExchange.getCurrencyCode()).build());
|
||||
|
||||
// 检查平台密钥是否存在,否则抛出异常
|
||||
// ApiException.notNull(gameSecretKey, ErrorCode.CURRENCY_NOT_EXIST.getCode());
|
||||
|
||||
TenantQuotaExchange tenantQuotaExchange = tenantQuotaExchangeService.getTenantQuotaExchange(Constants.USDT, gameBalanceExchange.getCurrencyCode());
|
||||
ApiException.notNull(tenantQuotaExchange, ErrorCode.CURRENCY_EXCHANGE.getCode());
|
||||
|
|
@ -296,14 +289,11 @@ public class TenantGameQuotaServiceImpl implements ITenantGameQuotaService {
|
|||
ApiException.notNull(tenantPlatform, ErrorCode.PLATFORM_NOT_EXIST.getCode());
|
||||
|
||||
|
||||
|
||||
// 获取用户信息
|
||||
Member member = memberService.selectMemberByAccount(gameBalanceExchange.getAccount(), gameBalanceExchange.getCurrencyCode(), gameBalanceExchange.getPlatformCode());
|
||||
ApiException.notNull(member, ErrorCode.ACCOUNT_NOT_EXIST.getCode());
|
||||
|
||||
|
||||
|
||||
|
||||
// 检查用户是否存在,否则抛出异常
|
||||
ApiException.notNull(member, ErrorCode.ACCOUNT_NOT_EXIST.getCode());
|
||||
|
||||
|
|
@ -324,14 +314,21 @@ public class TenantGameQuotaServiceImpl implements ITenantGameQuotaService {
|
|||
|
||||
// 如果是出账操作
|
||||
if (isOut) {
|
||||
// 获取第三方钱包余额
|
||||
MemberInfoRequestDTO gamesBaseRequestDTO = MemberInfoRequestDTO.builder()
|
||||
.accounts(member.getGameAccount())
|
||||
.agentId(gameBalanceExchange.getAgentId())
|
||||
.currency(gameBalanceExchange.getCurrency())
|
||||
.agentKey(gameBalanceExchange.getAgentKey())
|
||||
.build();
|
||||
balanceRequestAmount = iGamesService.getMemberInfo(gamesBaseRequestDTO).getBalance();
|
||||
if (ObjectUtils.isEmpty(gameBalanceExchange.getIsAll())||gameBalanceExchange.getIsAll()){
|
||||
// 获取第三方钱包余额
|
||||
MemberInfoRequestDTO gamesBaseRequestDTO = MemberInfoRequestDTO.builder()
|
||||
.accounts(member.getGameAccount())
|
||||
.agentId(gameBalanceExchange.getAgentId())
|
||||
.currency(gameBalanceExchange.getCurrency())
|
||||
.agentKey(gameBalanceExchange.getAgentKey())
|
||||
.build();
|
||||
balanceRequestAmount = iGamesService.getMemberInfo(gamesBaseRequestDTO).getBalance();
|
||||
if (balanceRequestAmount.compareTo(BigDecimal.ZERO) <= 0) {
|
||||
throw new ApiException(ErrorCode.INSUFFICIENT_PLAYER_BALANCE.getCode());
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
balanceRequestAmount = NumberUtil.add(balanceRequestAmount, NumberUtil.mul(balanceRequestAmount, NumberUtil.div(tenantPlatform.getUseCost(), Constants.HUNDRED)));
|
||||
|
||||
// 计算累计转入和转出金额
|
||||
|
|
@ -393,12 +390,10 @@ public class TenantGameQuotaServiceImpl implements ITenantGameQuotaService {
|
|||
// 如果是扣账操作,首先处理假额度
|
||||
String falseTenantQuotaType = QuotaUtils.getFalseTenantQuota(gameBalanceExchange.getPlatformCode(), gameBalanceExchange.getCurrencyCode());
|
||||
TenantGameQuota falseTenantQuota = selectTenantGameQuotaByTenantKey(tenantSecretKey.getTenantKey(), falseTenantQuotaType);
|
||||
balanceRequestAmount = NumberUtil.add(gameBalanceExchange.getAmount(), NumberUtil.mul(gameBalanceExchange.getAmount(), NumberUtil.div(tenantPlatform.getUseCost(), Constants.HUNDRED)));
|
||||
balanceRequestAmount = NumberUtil.add(gameBalanceExchange.getAmount(), NumberUtil.mul(gameBalanceExchange.getAmount(), NumberUtil.div(tenantPlatform.getUseCost(), Constants.HUNDRED)));
|
||||
if (falseTenantQuota.getBalance().compareTo(BigDecimal.ZERO) > 0) {
|
||||
|
||||
|
||||
|
||||
|
||||
BigDecimal falseQuotaBalance = falseTenantQuota.getBalance();
|
||||
if (falseQuotaBalance.compareTo(balanceRequestAmount) >= 0) {
|
||||
// 假额度足够扣除本次所需金额
|
||||
|
|
|
|||
|
|
@ -0,0 +1,65 @@
|
|||
package com.ff.delay;
|
||||
|
||||
import com.ff.base.manager.AsyncManager;
|
||||
import lombok.extern.slf4j.Slf4j;
|
||||
import org.springframework.stereotype.Service;
|
||||
|
||||
import javax.annotation.PostConstruct;
|
||||
import java.util.concurrent.DelayQueue;
|
||||
import java.util.concurrent.Executors;
|
||||
import java.util.concurrent.ScheduledExecutorService;
|
||||
import java.util.concurrent.TimeUnit;
|
||||
|
||||
/**
|
||||
* @author cengy
|
||||
*/
|
||||
@Service
|
||||
@Slf4j
|
||||
public class DelayService {
|
||||
private DelayQueue<DelayTask> delayQueue = new DelayQueue<>();
|
||||
|
||||
private static final ScheduledExecutorService scheduler = Executors.newScheduledThreadPool(1);
|
||||
|
||||
public void addTask(DelayTask delayTask) {
|
||||
delayQueue.put(delayTask);
|
||||
}
|
||||
|
||||
// 启动延迟队列任务处理
|
||||
@PostConstruct
|
||||
public void startProcessing() {
|
||||
// 每 1 秒钟执行一次任务检查
|
||||
scheduler.scheduleAtFixedRate(this::processTasks, 10, 1, TimeUnit.SECONDS);
|
||||
}
|
||||
|
||||
// 处理过期任务
|
||||
private void processTasks() {
|
||||
DelayTask task = null; // 阻塞,直到队列中有任务到期
|
||||
try {
|
||||
task = delayQueue.take();
|
||||
} catch (InterruptedException e) {
|
||||
log.error("获取过期任务失败", e);
|
||||
}
|
||||
if (null == task) {
|
||||
return;
|
||||
}
|
||||
AsyncManager.me().execute(new DelayRunnable(task));
|
||||
}
|
||||
|
||||
public static class DelayRunnable implements Runnable {
|
||||
|
||||
DelayTask delayTask;
|
||||
|
||||
public DelayRunnable(DelayTask delayTask) {
|
||||
this.delayTask = delayTask;
|
||||
}
|
||||
|
||||
@Override
|
||||
public void run() {
|
||||
try {
|
||||
delayTask.execute();
|
||||
} catch (Exception e) {
|
||||
log.error("处理过期任务出错", e);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
@ -0,0 +1,44 @@
|
|||
package com.ff.delay;
|
||||
|
||||
import lombok.AllArgsConstructor;
|
||||
import lombok.Data;
|
||||
import lombok.NoArgsConstructor;
|
||||
|
||||
import java.util.concurrent.Delayed;
|
||||
import java.util.concurrent.TimeUnit;
|
||||
|
||||
/**
|
||||
* @author cengy
|
||||
*/
|
||||
@Data
|
||||
@AllArgsConstructor
|
||||
@NoArgsConstructor
|
||||
public abstract class DelayTask implements Delayed {
|
||||
private long delayTime;
|
||||
private long expireTime;
|
||||
|
||||
public DelayTask(long delayTime) {
|
||||
this.delayTime = delayTime;
|
||||
this.expireTime = System.currentTimeMillis() + delayTime; // 设置过期时间
|
||||
}
|
||||
|
||||
@Override
|
||||
public long getDelay(TimeUnit unit) {
|
||||
long diff = expireTime - System.currentTimeMillis();
|
||||
return unit.convert(diff, TimeUnit.MILLISECONDS);
|
||||
}
|
||||
|
||||
@Override
|
||||
public int compareTo(Delayed o) {
|
||||
if (this.expireTime < ((DelayTask) o).expireTime) {
|
||||
return -1;
|
||||
}
|
||||
if (this.expireTime > ((DelayTask) o).expireTime) {
|
||||
return 1;
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
|
||||
abstract public void execute();
|
||||
}
|
||||
|
||||
|
|
@ -52,6 +52,14 @@ public interface IGamesService {
|
|||
*/
|
||||
String getGameList(GamesBaseRequestDTO gamesBaseRequestDTO);
|
||||
|
||||
/**
|
||||
* 获取交易id
|
||||
*
|
||||
* @param transactionIdRequestDTO 事务id请求dto
|
||||
* @return {@link String }
|
||||
*/
|
||||
String getTransactionId(TransactionIdRequestDTO transactionIdRequestDTO);
|
||||
|
||||
|
||||
/**
|
||||
* 按代理id进行交换转账
|
||||
|
|
@ -66,9 +74,9 @@ public interface IGamesService {
|
|||
* 汇兑转移状态确认
|
||||
*
|
||||
* @param exchangeTransferMoneyRequestDTO 兑换转账请求dto
|
||||
* @return {@link Boolean }
|
||||
* @return {@link ExchangeTransferStatusResponseDTO }
|
||||
*/
|
||||
Boolean exchangeTransferStatus(ExchangeTransferStatusRequestDTO exchangeTransferMoneyRequestDTO);
|
||||
ExchangeTransferStatusResponseDTO exchangeTransferStatus(ExchangeTransferStatusRequestDTO exchangeTransferMoneyRequestDTO);
|
||||
|
||||
|
||||
/**
|
||||
|
|
|
|||
|
|
@ -3,6 +3,8 @@ package com.ff.game.api.ae.dto;
|
|||
import com.fasterxml.jackson.annotation.JsonProperty;
|
||||
import lombok.Data;
|
||||
|
||||
import java.math.BigDecimal;
|
||||
|
||||
|
||||
/**
|
||||
* aeexchange传输状态响应
|
||||
|
|
@ -32,13 +34,13 @@ public class AEExchangeTransferStatusResponse {
|
|||
* 当前余额
|
||||
*/
|
||||
@JsonProperty("balance")
|
||||
private double balance;
|
||||
private BigDecimal balance;
|
||||
|
||||
/**
|
||||
* 转账金额
|
||||
*/
|
||||
@JsonProperty("transferAmount")
|
||||
private double transferAmount;
|
||||
private BigDecimal transferAmount;
|
||||
|
||||
/**
|
||||
* 转账类型(如:DEPOSIT 或 WITHDRAW)
|
||||
|
|
|
|||
|
|
@ -16,10 +16,13 @@ import com.ff.base.utils.uuid.IdUtils;
|
|||
import com.ff.common.dto.GameBalanceExchange;
|
||||
import com.ff.common.service.ITenantGameQuotaService;
|
||||
import com.ff.config.KeyConfig;
|
||||
import com.ff.delay.DelayService;
|
||||
import com.ff.delay.DelayTask;
|
||||
import com.ff.game.api.IGamesService;
|
||||
import com.ff.game.api.ae.client.AEClient;
|
||||
import com.ff.game.api.ae.dto.*;
|
||||
import com.ff.game.api.request.*;
|
||||
import com.ff.game.api.sv388.impl.SV388GamesServiceImpl;
|
||||
import com.ff.game.api.xk.dto.XKKickMemberDTO;
|
||||
import com.ff.game.domain.*;
|
||||
import com.ff.game.service.IGameBettingDetailsService;
|
||||
|
|
@ -79,20 +82,14 @@ public class GamesAEServiceImpl implements IGamesService {
|
|||
@Resource
|
||||
private IGameBettingDetailsService gameBettingDetailsService;
|
||||
|
||||
@Resource
|
||||
private DelayService delayService;
|
||||
|
||||
/**
|
||||
* 游戏id
|
||||
*/
|
||||
private static final Long GAME_ID = 1904452832756013817L;
|
||||
|
||||
/**
|
||||
* 平台ID
|
||||
*/
|
||||
private static final Long PLATFORM_ID = 1904411420257108325L;
|
||||
|
||||
/**
|
||||
* 游戏名称id
|
||||
*/
|
||||
private static final Long GAME_NAME_ID = 1904452833756002317L;
|
||||
|
||||
/**
|
||||
* 获得就是成功
|
||||
|
|
@ -202,18 +199,6 @@ public class GamesAEServiceImpl implements IGamesService {
|
|||
@Transactional
|
||||
@Override
|
||||
public String getGameList(GamesBaseRequestDTO gamesBaseRequestDTO) {
|
||||
// GamePlatform gamePlatform = gamePlatformService.selectGamePlatformById(PLATFORM_ID);
|
||||
//没有此平台就新增一个平台
|
||||
// if (ObjectUtils.isEmpty(gamePlatform)) {
|
||||
// gamePlatform = new GamePlatform();
|
||||
// gamePlatform.setId(PLATFORM_ID);
|
||||
// gamePlatform.setPlatformCode(GamePlatforms.AE.getInfo());
|
||||
// gamePlatform.setPlatformType(PlatformType.GAME_HALL.getCode());
|
||||
// gamePlatform.setPlatformName(GamePlatforms.AE.getInfo() + PlatformType.GAME_HALL.getName());
|
||||
// gamePlatform.setSortNo(gamePlatformService.selectMaxSortNo() + 1);
|
||||
// gamePlatform.setCreateBy(Constants.SYSTEM);
|
||||
// gamePlatformService.insertGamePlatform(gamePlatform);
|
||||
// }
|
||||
Platform platform = gamesBaseRequestDTO.getVendor();
|
||||
Game game = gameService.selectGameById(GAME_ID);
|
||||
//不存在这个游戏
|
||||
|
|
@ -221,7 +206,6 @@ public class GamesAEServiceImpl implements IGamesService {
|
|||
game = new Game();
|
||||
game.setId(GAME_ID);
|
||||
game.setSortNo(gameService.selectMaxSortNo(PlatformType.GAME_HALL.getCode(), GamePlatforms.AE.getCode()) + 1);
|
||||
//game.setPlatformId(gamePlatform.getId());
|
||||
game.setPlatformCode(platform.getPlatformCode());
|
||||
game.setPlatformType(PlatformType.GAME_HALL.getCode());
|
||||
game.setGameCode("1");
|
||||
|
|
@ -232,20 +216,27 @@ public class GamesAEServiceImpl implements IGamesService {
|
|||
nameInfo.setLang("zh-CN");
|
||||
nameInfo.setName("AE大厅");
|
||||
game.setNameInfo(Collections.singletonList(nameInfo));
|
||||
game.setGameId(StringUtils.addSuffix(GamePlatforms.AE.getCode(), 1));
|
||||
gameService.insertGame(game);
|
||||
}else {
|
||||
NameInfo nameInfo = new NameInfo();
|
||||
nameInfo.setLang("zh-CN");
|
||||
nameInfo.setName("AE大厅");
|
||||
game.setNameInfo(Collections.singletonList(nameInfo));
|
||||
gameService.updateGame(game);
|
||||
}
|
||||
/*GameName gameName = gameNameService.selectGameNameById(GAME_NAME_ID);
|
||||
if (ObjectUtils.isEmpty(gameName)) {
|
||||
gameNameService.insertGameName(GameName.builder()
|
||||
.id(GAME_NAME_ID)
|
||||
.gameId(game.getId())
|
||||
.gameName(game.getGameName())
|
||||
.langCode("zh-CN")
|
||||
.createBy(Constants.SYSTEM)
|
||||
.build());
|
||||
}*/
|
||||
return CacheConstants.AE_GAMES;
|
||||
}
|
||||
|
||||
return CacheConstants.XK_GAMES;
|
||||
/**
|
||||
* 获取交易id
|
||||
*
|
||||
* @param transactionIdRequestDTO 事务id请求dto
|
||||
* @return {@link String }
|
||||
*/
|
||||
@Override
|
||||
public String getTransactionId(TransactionIdRequestDTO transactionIdRequestDTO) {
|
||||
return GamePlatforms.AE.getCode() + IdUtils.simpleUUID();
|
||||
}
|
||||
|
||||
/**
|
||||
|
|
@ -258,72 +249,52 @@ public class GamesAEServiceImpl implements IGamesService {
|
|||
@Transactional
|
||||
public Long exchangeTransferByAgentId(ExchangeTransferMoneyRequestDTO exchangeTransferMoneyRequestDTO) {
|
||||
log.info("GamesAEServiceImpl [exchangeTransferByAgentId] 请求参数 {}", exchangeTransferMoneyRequestDTO);
|
||||
// GameSecretKeyCurrency currencyDTO = gameSecretKeyCurrencyService.findByGameSecretKeyCurrencyDTO(GameSecretKeyCurrencyDTO.builder()
|
||||
// .platformCode(GamePlatforms.AE.getInfo())
|
||||
// .code(exchangeTransferMoneyRequestDTO.getAgentId())
|
||||
// .build());
|
||||
|
||||
Member member = memberService.selectMemberByGameAccount(exchangeTransferMoneyRequestDTO.getAccount());
|
||||
String transactionId = GamePlatforms.AE.getCode() + IdUtils.simpleUUID();
|
||||
List<GameExchangeMoney> gameExchangeMonies = gameExchangeMoneyService.selectGameExchangeMoneyList(
|
||||
GameExchangeMoney.builder()
|
||||
.tenantKey(exchangeTransferMoneyRequestDTO.getTenantKey())
|
||||
.orderId(exchangeTransferMoneyRequestDTO.getOrderId())
|
||||
.build()
|
||||
);
|
||||
Assert.isTrue(CollectionUtils.isEmpty(gameExchangeMonies), "订单号重复");
|
||||
|
||||
//获取下一个自增id
|
||||
GameExchangeMoney exchangeMoney = GameExchangeMoney
|
||||
.builder()
|
||||
.tenantKey(exchangeTransferMoneyRequestDTO.getTenantKey())
|
||||
.orderId(exchangeTransferMoneyRequestDTO.getOrderId())
|
||||
.quota(exchangeTransferMoneyRequestDTO.getQuota())
|
||||
.balance(exchangeTransferMoneyRequestDTO.getAmount())
|
||||
.exchangeType(exchangeTransferMoneyRequestDTO.getTransferType())
|
||||
.currencyCode(exchangeTransferMoneyRequestDTO.getSystemCurrency())
|
||||
.memberId(member.getId())
|
||||
.transactionId(transactionId)
|
||||
.platformCode(GamePlatforms.AE.getInfo())
|
||||
.build();
|
||||
exchangeMoney.setCreateBy(Constants.SYSTEM);
|
||||
GameExchangeMoney exchangeMoney = gameExchangeMoneyService.selectGameExchangeMoneyById(exchangeTransferMoneyRequestDTO.getGameExchangeId());
|
||||
|
||||
|
||||
|
||||
Map<String, Object> params = this.getKey(exchangeTransferMoneyRequestDTO);
|
||||
AETransactionResponse deposit = null;
|
||||
try {
|
||||
if (TransferType.GAMES.getCode().equals(exchangeTransferMoneyRequestDTO.getTransferType())) {
|
||||
|
||||
params.put("userId", exchangeTransferMoneyRequestDTO.getAccount());
|
||||
params.put("txCode", transactionId);
|
||||
params.put("txCode", exchangeTransferMoneyRequestDTO.getTransactionId());
|
||||
params.put("transferAmount", exchangeTransferMoneyRequestDTO.getAmount());
|
||||
deposit = AEClient.deposit(params);
|
||||
|
||||
} else {
|
||||
params.put("userId", exchangeTransferMoneyRequestDTO.getAccount());
|
||||
params.put("txCode", transactionId);
|
||||
params.put("txCode", exchangeTransferMoneyRequestDTO.getTransactionId());
|
||||
params.put("withdrawType", 1);
|
||||
deposit = AEClient.withdraw(params);
|
||||
}
|
||||
} finally {
|
||||
}finally {
|
||||
BigDecimal coinBefore;
|
||||
if (TransferType.GAMES.getCode().equals(exchangeTransferMoneyRequestDTO.getTransferType())) {
|
||||
coinBefore = NumberUtil.sub(deposit.getCurrentBalance(), deposit.getAmount());
|
||||
} else {
|
||||
coinBefore = NumberUtil.add(deposit.getCurrentBalance(), deposit.getAmount());
|
||||
}
|
||||
//判断是否转移成功
|
||||
if ("0000".equals(deposit.getStatus())) {
|
||||
exchangeMoney.setStep(GameExchangeStep.PLATFORM_TRANSACTION.getCode());
|
||||
exchangeMoney.setStepStatus(GameExchangeStepStatus.SUCCESS.getCode());
|
||||
} else {
|
||||
exchangeMoney.setStep(GameExchangeStep.PLATFORM_TRANSACTION.getCode());
|
||||
exchangeMoney.setStepStatus(GameExchangeStepStatus.IN_PROGRESS.getCode());
|
||||
}
|
||||
//更新数据
|
||||
exchangeMoney.setBalance(deposit.getAmount());
|
||||
exchangeMoney.setCoinBefore(coinBefore);
|
||||
exchangeMoney.setCoinAfter(deposit.getCurrentBalance());
|
||||
exchangeMoney.setCurrencyBefore(exchangeMoney.getCoinBefore());
|
||||
exchangeMoney.setCurrencyAfter(exchangeMoney.getCoinAfter());
|
||||
//判断是否转移成功
|
||||
if ("0000".equals(deposit.getStatus())) {
|
||||
exchangeMoney.setStatus(StatusType.SUCCESS.getValue());
|
||||
} else {
|
||||
exchangeMoney.setStatus(StatusType.IN_PROGRESS.getValue());
|
||||
}
|
||||
gameExchangeMoneyService.updateGameExchangeMoney(exchangeMoney);
|
||||
|
||||
|
||||
gameExchangeMoneyService.insertGameExchangeMoney(exchangeMoney);
|
||||
}
|
||||
|
||||
|
||||
|
|
@ -334,10 +305,10 @@ public class GamesAEServiceImpl implements IGamesService {
|
|||
* 汇兑转移状态
|
||||
*
|
||||
* @param exchangeTransferMoneyRequestDTO 兑换转账请求dto
|
||||
* @return {@link Boolean }
|
||||
* @return {@link ExchangeTransferStatusResponseDTO }
|
||||
*/
|
||||
@Override
|
||||
public Boolean exchangeTransferStatus(ExchangeTransferStatusRequestDTO exchangeTransferMoneyRequestDTO) {
|
||||
public ExchangeTransferStatusResponseDTO exchangeTransferStatus(ExchangeTransferStatusRequestDTO exchangeTransferMoneyRequestDTO) {
|
||||
log.info("GamesAEServiceImpl [exchangeTransferStatus] 请求参数 {}", exchangeTransferMoneyRequestDTO);
|
||||
|
||||
Map<String, Object> paramsMap = this.getKey(exchangeTransferMoneyRequestDTO);
|
||||
|
|
@ -353,41 +324,38 @@ public class GamesAEServiceImpl implements IGamesService {
|
|||
status = StatusType.FAILURE.getValue();
|
||||
}
|
||||
GameExchangeMoney exchangeMoney = gameExchangeMoneyService.selectGameExchangeMoneyById(exchangeTransferMoneyRequestDTO.getGameExchangeMoneyId());
|
||||
|
||||
//如果失败扣除租户之前被扣额度
|
||||
if (status.equals(StatusType.FAILURE.getValue())) {
|
||||
Member member = memberService.selectMemberById(exchangeMoney.getMemberId());
|
||||
tenantGameQuotaService.gameBalanceExchange(GameBalanceExchange.builder()
|
||||
.platformCode(exchangeMoney.getPlatformCode())
|
||||
.sourceId(exchangeMoney.getOrderId())
|
||||
.currencyCode(exchangeMoney.getCurrencyCode())
|
||||
.transferType(TransferType.ALL.getCode())
|
||||
.amount(exchangeMoney.getBalance())
|
||||
.account(member.getMemberAccount())
|
||||
.tenantKey(exchangeMoney.getTenantKey())
|
||||
.currency(exchangeTransferMoneyRequestDTO.getCurrency())
|
||||
.systemCurrency(exchangeTransferMoneyRequestDTO.getSystemCurrency())
|
||||
.agentKey(exchangeTransferMoneyRequestDTO.getAgentKey())
|
||||
.agentId(exchangeTransferMoneyRequestDTO.getAgentId())
|
||||
.build());
|
||||
//更新
|
||||
BigDecimal coinBefore;
|
||||
if (TransferType.GAMES.getCode().equals(exchangeMoney.getExchangeType())) {
|
||||
coinBefore = NumberUtil.sub(exchangeTransferStatusResponse.getBalance(), exchangeTransferStatusResponse.getTransferAmount());
|
||||
} else {
|
||||
coinBefore = NumberUtil.add(exchangeTransferStatusResponse.getBalance(), exchangeTransferStatusResponse.getTransferAmount());
|
||||
}
|
||||
exchangeMoney.setStatus(status);
|
||||
exchangeMoney.setUpdateBy(Constants.SYSTEM);
|
||||
gameExchangeMoneyService.updateGameExchangeMoney(exchangeMoney);
|
||||
|
||||
|
||||
return Boolean.TRUE;
|
||||
|
||||
return ExchangeTransferStatusResponseDTO.builder()
|
||||
.statusType(status)
|
||||
.balance(exchangeTransferStatusResponse.getTransferAmount())
|
||||
.coinBefore(coinBefore)
|
||||
.coinAfter(exchangeTransferStatusResponse.getBalance())
|
||||
.build();
|
||||
}
|
||||
|
||||
class GetRealtimeRecordTask extends DelayTask {
|
||||
BetRecordByTimeDTO betRecordByTimeDTO;
|
||||
|
||||
/**
|
||||
* 按时间获取投注记录
|
||||
*
|
||||
* @param betRecordByTimeDTO 按时间dto投注记录
|
||||
* @return {@link List }<{@link GameBettingDetails }>
|
||||
*/
|
||||
@Override
|
||||
public Boolean getBetRecordByTime(BetRecordByTimeDTO betRecordByTimeDTO) {
|
||||
public GetRealtimeRecordTask(BetRecordByTimeDTO betRecordByTimeDTO) {
|
||||
this.betRecordByTimeDTO = betRecordByTimeDTO;
|
||||
}
|
||||
|
||||
@Override
|
||||
public void execute() {
|
||||
getRealtimeRecord(betRecordByTimeDTO);
|
||||
}
|
||||
}
|
||||
|
||||
void getRealtimeRecord(BetRecordByTimeDTO betRecordByTimeDTO) {
|
||||
//请求参数
|
||||
log.info("GamesAEServiceImpl [getBetRecordByTime] 请求参数 {}", betRecordByTimeDTO);
|
||||
Map<String, Object> params = this.getKey(betRecordByTimeDTO);
|
||||
|
|
@ -407,27 +375,35 @@ public class GamesAEServiceImpl implements IGamesService {
|
|||
if (this.getIsSuccess(aeBetRecordResponse.getStatus())) {
|
||||
//数据组装
|
||||
this.batchInsert(aeBetRecordResponse, betRecordByTimeDTO);
|
||||
return Boolean.TRUE;
|
||||
if (aeBetRecordResponse.getTransactions().size() >= 20000) {
|
||||
delayService.addTask(new GetRealtimeRecordTask(betRecordByTimeDTO));
|
||||
}
|
||||
//return Boolean.TRUE;
|
||||
} else {
|
||||
redisCache.deleteObject(CacheConstants.AE_TIME_FROM);
|
||||
log.error("GamesAEServiceImpl [getBetRecordByTime] 获取投注记录失败,错误代码{},错误信息{}", aeBetRecordResponse.getStatus(), aeBetRecordResponse.getDesc());
|
||||
throw new BaseException(aeBetRecordResponse.getDesc());
|
||||
//throw new BaseException(aeBetRecordResponse.getDesc());
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
/**
|
||||
* 按历史时间获取投注记录
|
||||
*
|
||||
* @param betRecordByTimeDTO 按时间dto投注记录
|
||||
* @return {@link Boolean }
|
||||
*/
|
||||
@Override
|
||||
public Boolean getBetRecordByHistoryTime(BetRecordByTimeDTO betRecordByTimeDTO) {
|
||||
class GetHistoryRecordTask extends DelayTask {
|
||||
BetRecordByTimeDTO betRecordByTimeDTO;
|
||||
|
||||
public GetHistoryRecordTask(BetRecordByTimeDTO betRecordByTimeDTO) {
|
||||
this.betRecordByTimeDTO = betRecordByTimeDTO;
|
||||
}
|
||||
|
||||
@Override
|
||||
public void execute() {
|
||||
getHistoryRecord(betRecordByTimeDTO);
|
||||
}
|
||||
}
|
||||
|
||||
void getHistoryRecord(BetRecordByTimeDTO betRecordByTimeDTO) {
|
||||
log.info("GamesAEServiceImpl [getBetRecordByHistoryTime] 请求参数 {}", betRecordByTimeDTO);
|
||||
Map<String, Object> params = this.getKey(betRecordByTimeDTO);
|
||||
|
||||
long startTimeLong = DateUtils.addOrSubtractMinutes(betRecordByTimeDTO.getStartTime(), -40);
|
||||
String startTime = DateUtils.convertTimestampToFormattedDate(startTimeLong, DateUtils.ISO_8601_FORMAT, "GMT+8") + "+08:00";
|
||||
String startTime = DateUtils.convertTimestampToFormattedDate(betRecordByTimeDTO.getStartTime(), DateUtils.ISO_8601_FORMAT, "GMT+8") + "+08:00";
|
||||
String endTime = DateUtils.convertTimestampToFormattedDate(betRecordByTimeDTO.getEndTime(), DateUtils.ISO_8601_FORMAT, "GMT+8") + "+08:00";
|
||||
|
||||
|
||||
|
|
@ -440,13 +416,40 @@ public class GamesAEServiceImpl implements IGamesService {
|
|||
if (this.getIsSuccess(aeBetRecordResponse.getStatus())) {
|
||||
//数据组装
|
||||
this.batchInsert(aeBetRecordResponse, betRecordByTimeDTO);
|
||||
return Boolean.TRUE;
|
||||
if (aeBetRecordResponse.getTransactions().size() >= 20000) {
|
||||
delayService.addTask(new GetHistoryRecordTask(betRecordByTimeDTO));
|
||||
}
|
||||
// return Boolean.TRUE;
|
||||
} else {
|
||||
log.error("GamesAEServiceImpl [getBetRecordByHistoryTime] 获取投注记录失败,错误代码{},错误信息{}", aeBetRecordResponse.getStatus(), aeBetRecordResponse.getDesc());
|
||||
throw new BaseException(aeBetRecordResponse.getDesc());
|
||||
// throw new BaseException(aeBetRecordResponse.getDesc());
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* 按时间获取投注记录
|
||||
*
|
||||
* @param betRecordByTimeDTO 按时间dto投注记录
|
||||
* @return {@link List }<{@link GameBettingDetails }>
|
||||
*/
|
||||
@Override
|
||||
public Boolean getBetRecordByTime(BetRecordByTimeDTO betRecordByTimeDTO) {
|
||||
delayService.addTask(new GetRealtimeRecordTask(betRecordByTimeDTO));
|
||||
return Boolean.TRUE;
|
||||
}
|
||||
|
||||
/**
|
||||
* 按历史时间获取投注记录
|
||||
*
|
||||
* @param betRecordByTimeDTO 按时间dto投注记录
|
||||
* @return {@link Boolean }
|
||||
*/
|
||||
@Override
|
||||
public Boolean getBetRecordByHistoryTime(BetRecordByTimeDTO betRecordByTimeDTO) {
|
||||
delayService.addTask(new GetHistoryRecordTask(betRecordByTimeDTO));
|
||||
return Boolean.TRUE;
|
||||
}
|
||||
|
||||
/**
|
||||
* 赠送免费局数
|
||||
*
|
||||
|
|
@ -539,7 +542,7 @@ public class GamesAEServiceImpl implements IGamesService {
|
|||
*
|
||||
* @param aeBetRecordResponse ae下注记录响应dto
|
||||
*/
|
||||
private void batchInsert(AEBetRecordResponse aeBetRecordResponse, BetRecordByTimeDTO betRecordByTimeDTO) {
|
||||
private synchronized void batchInsert(AEBetRecordResponse aeBetRecordResponse, BetRecordByTimeDTO betRecordByTimeDTO) {
|
||||
List<GameBettingDetails> gameBettingDetails = new ArrayList<>();
|
||||
List<String> wagersIds = new ArrayList<>();
|
||||
//数据组装
|
||||
|
|
@ -586,10 +589,6 @@ public class GamesAEServiceImpl implements IGamesService {
|
|||
//转化类
|
||||
AEBetRecordResponse.Transaction resultBean = (AEBetRecordResponse.Transaction) gamesDataBuildDTO.getData();
|
||||
|
||||
/*GameSecretKeyCurrency currencyDTO = gameSecretKeyCurrencyService.findByGameSecretKeyCurrencyDTO(GameSecretKeyCurrencyDTO.builder()
|
||||
.platformCode(GamePlatforms.AE.getInfo())
|
||||
.currency(resultBean.getCurrency())
|
||||
.build());*/
|
||||
|
||||
Member member = memberService.selectMemberByGameAccount(resultBean.getUserId());
|
||||
if (ObjectUtils.isEmpty(member)) {
|
||||
|
|
@ -623,7 +622,7 @@ public class GamesAEServiceImpl implements IGamesService {
|
|||
.gameCode(resultBean.getGameCode())
|
||||
.gameType(PlatformType.GAME_HALL.getCode())
|
||||
.platformCode(GamePlatforms.AE.getCode())
|
||||
.gameId(GAME_ID)
|
||||
.gameId(/*GAME_ID*/ StringUtils.addSuffix(GamePlatforms.AE.getCode(), 1))
|
||||
.gameName(resultBean.getGameName())
|
||||
.gameStatus(gameStatus)
|
||||
.gameStatusType(resultBean.getSettleStatus())
|
||||
|
|
|
|||
|
|
@ -0,0 +1,32 @@
|
|||
package com.ff.game.api.db.address;
|
||||
|
||||
import com.dtflys.forest.callback.AddressSource;
|
||||
import com.dtflys.forest.http.ForestAddress;
|
||||
import com.dtflys.forest.http.ForestRequest;
|
||||
import com.ff.base.enums.GamePlatforms;
|
||||
import com.ff.game.service.IPlatformService;
|
||||
import org.springframework.stereotype.Component;
|
||||
|
||||
import javax.annotation.Resource;
|
||||
|
||||
|
||||
/**
|
||||
* <a href="http://api-doc-2.dbsporxxxw1box.com/#/login">DB体育对接文档</a>
|
||||
* 账号: api
|
||||
* 密码: a12345678
|
||||
*
|
||||
* @author cengy
|
||||
*/
|
||||
@Component
|
||||
public class DBSportsAddress implements AddressSource {
|
||||
|
||||
@Resource
|
||||
private IPlatformService platformService;
|
||||
|
||||
@Override
|
||||
public ForestAddress getAddress(ForestRequest request) {
|
||||
String apiBaseUrl = platformService.get(GamePlatforms.DBSports.getCode())
|
||||
.getUrlInfo().getUrl();
|
||||
return new ForestAddress("https", apiBaseUrl, 443, "");
|
||||
}
|
||||
}
|
||||
|
|
@ -0,0 +1,110 @@
|
|||
package com.ff.game.api.db.client;
|
||||
|
||||
import com.dtflys.forest.annotation.*;
|
||||
import com.ff.game.api.db.address.DBSportsAddress;
|
||||
import com.ff.game.api.db.dto.*;
|
||||
|
||||
/**
|
||||
* @author cengy
|
||||
*/
|
||||
@Address(source = DBSportsAddress.class)
|
||||
public interface DBSportsClient {
|
||||
/**
|
||||
* 创建投注用户
|
||||
*
|
||||
* @return {@link CreateUserResponse}
|
||||
*/
|
||||
@Post(url = "/api/user/create",
|
||||
headers = {
|
||||
"Content-type: application/x-www-form-urlencoded"
|
||||
}
|
||||
)
|
||||
CreateUserResponse createMember(@Body CreateUserRequest request,
|
||||
@Header("requestId") @Var("requestId") String requestId);
|
||||
|
||||
/**
|
||||
* 用户登录接口(注册和登录合并为一个接口)
|
||||
*
|
||||
* @param request
|
||||
* @param requestId
|
||||
* @return
|
||||
*/
|
||||
@Post(url = "/api/user/login",
|
||||
headers = {
|
||||
"Content-type: application/x-www-form-urlencoded"
|
||||
}
|
||||
)
|
||||
LoginResponse login(@Body LoginRequest request,
|
||||
@Header("requestId") String requestId);
|
||||
|
||||
/**
|
||||
* 用户金额转入到DB体育平台,支持两位小数,最小0.01,必须是正数
|
||||
*
|
||||
* @param request
|
||||
* @return {@link TransferResponse}
|
||||
*/
|
||||
@Post(url = "/api/fund/transfer",
|
||||
headers = {
|
||||
"Content-type: application/x-www-form-urlencoded"
|
||||
}
|
||||
)
|
||||
TransferResponse transferIn(@Body TransferRequest request,
|
||||
@Header("requestId") @Var("requestId") String requestId
|
||||
);
|
||||
|
||||
@Post(url = "/api/fund/transfer",
|
||||
headers = {
|
||||
"Content-type: application/x-www-form-urlencoded"
|
||||
}
|
||||
)
|
||||
TransferResponse transferOut(@Body TransferRequest request,
|
||||
@Header("requestId") String requestId
|
||||
);
|
||||
|
||||
@Post(url = "/api/fund/checkBalance",
|
||||
headers = {
|
||||
"Content-type: application/x-www-form-urlencoded"
|
||||
}
|
||||
)
|
||||
GetMemberInfoResponse getMemberInfo(@Body GetMemberInfoRequest request,
|
||||
@Header("requestId") String requestId);
|
||||
|
||||
/**
|
||||
* 根据转账ID查询交易记录接口。
|
||||
*/
|
||||
@Post(url = "/api/fund/getTransferRecord",
|
||||
headers = {
|
||||
"Content-type: application/x-www-form-urlencoded"
|
||||
}
|
||||
)
|
||||
TransferDetailResponse transferDetail(@Body TransferDetailRequest request,
|
||||
@Header("requestId") String requestId);
|
||||
|
||||
/**
|
||||
* 剔用户
|
||||
*
|
||||
* @param request
|
||||
* @param requestId
|
||||
* @return
|
||||
*/
|
||||
@Post(value = "/api/user/kickOutUser",
|
||||
headers = {
|
||||
"Content-type: application/x-www-form-urlencoded"
|
||||
}
|
||||
)
|
||||
KickUserResponse kickUser(@Body KickUserRequest request,
|
||||
@Header("requestId") String requestId);
|
||||
|
||||
|
||||
/**
|
||||
* 拉取订单Json数据
|
||||
*/
|
||||
@Post(url = "/api/bet/queryBetListV2",
|
||||
headers = {
|
||||
"Content-type: application/x-www-form-urlencoded"
|
||||
}
|
||||
)
|
||||
GetBetListResponse getBetList(@Body GetBetListRequest request,
|
||||
@Header("requestId") String requestId);
|
||||
|
||||
}
|
||||
|
|
@ -0,0 +1,28 @@
|
|||
package com.ff.game.api.db.dto;
|
||||
|
||||
import com.ff.base.utils.sign.Md5Utils;
|
||||
import lombok.Data;
|
||||
|
||||
import java.io.Serializable;
|
||||
|
||||
/**
|
||||
* @author cengy
|
||||
*/
|
||||
@Data
|
||||
public class CreateUserRequest implements Serializable {
|
||||
|
||||
private static final long serialVersionUID = 1L;
|
||||
|
||||
private String userName; // 用户名(可以包含但是不要等同于特殊字符或者空格,长度控制在30个字符以下)
|
||||
private String merchantCode; // 商户code
|
||||
private String timestamp = System.currentTimeMillis() + ""; // 13位时间戳
|
||||
private String currency; // 币种
|
||||
private String nickname; // N 昵称
|
||||
private String agentId; // N 信用网(代理id)
|
||||
private String signature; // 签名 signature =MD5(MD5(userName +”&”+ merchantCode +”&”+ timestamp) + ”&”+ key)
|
||||
|
||||
public void buildSignature(String key) {
|
||||
String signature = Md5Utils.md5New(Md5Utils.md5New(userName + "&" + merchantCode + "&" + timestamp) + "&" + key);
|
||||
this.signature = signature;
|
||||
}
|
||||
}
|
||||
|
|
@ -0,0 +1,26 @@
|
|||
package com.ff.game.api.db.dto;
|
||||
|
||||
import lombok.Data;
|
||||
|
||||
import java.io.Serializable;
|
||||
|
||||
/**
|
||||
* @author cengy
|
||||
*/
|
||||
@Data
|
||||
public class CreateUserResponse implements Serializable {
|
||||
|
||||
private static final long serialVersionUID = 1L;
|
||||
|
||||
private Boolean status;
|
||||
private String msg;
|
||||
private String code;
|
||||
private Long serverTime;
|
||||
private UserDTO data;
|
||||
|
||||
@Data
|
||||
public static class UserDTO {
|
||||
private String userId;
|
||||
}
|
||||
|
||||
}
|
||||
|
|
@ -0,0 +1,9 @@
|
|||
package com.ff.game.api.db.dto;
|
||||
|
||||
/**
|
||||
* @author cengy
|
||||
*/
|
||||
public class Enums {
|
||||
|
||||
|
||||
}
|
||||
|
|
@ -0,0 +1,93 @@
|
|||
package com.ff.game.api.db.dto;
|
||||
|
||||
import com.ff.base.utils.sign.Md5Utils;
|
||||
import lombok.Data;
|
||||
|
||||
import java.io.Serializable;
|
||||
|
||||
/**
|
||||
* @author cengy
|
||||
*/
|
||||
@Data
|
||||
public class GetBetListRequest implements Serializable {
|
||||
|
||||
private static final long serialVersionUID = 1L;
|
||||
|
||||
/**
|
||||
* 用户名(可选)
|
||||
*/
|
||||
private String userName;
|
||||
|
||||
/**
|
||||
* 开始时间(13位时间戳,必填)
|
||||
*/
|
||||
private String startTime;
|
||||
|
||||
/**
|
||||
* 结束时间(13位时间戳,必填)
|
||||
*/
|
||||
private String endTime;
|
||||
|
||||
/**
|
||||
* 商户编码(必填)
|
||||
*/
|
||||
private String merchantCode;
|
||||
|
||||
/**
|
||||
* 赛种ID(可选)
|
||||
*/
|
||||
private Integer sportId;
|
||||
|
||||
/**
|
||||
* 联赛ID(可选)
|
||||
*/
|
||||
private Long tournamentId;
|
||||
|
||||
/**
|
||||
* 结算状态(可选)
|
||||
* 0: 未结算
|
||||
* 1: 已结算
|
||||
* 2: 取消人工
|
||||
* 3: 待确认
|
||||
* 4: 风控拒单
|
||||
* 5: 撤单(赛事取消)
|
||||
*/
|
||||
private Integer settleStatus;
|
||||
|
||||
/**
|
||||
* 页面编号,从1开始(可选)
|
||||
*/
|
||||
private Integer pageNum;
|
||||
|
||||
/**
|
||||
* 每页条数(最大1000,可选)
|
||||
*/
|
||||
private Integer pageSize;
|
||||
|
||||
/**
|
||||
* 请求时间戳(13位,必填)
|
||||
*/
|
||||
private String timestamp = String.valueOf(System.currentTimeMillis());
|
||||
|
||||
/**
|
||||
* 排序方式(可选)
|
||||
* 1: 订单创建时间(投注时间)
|
||||
* 2: 订单更新时间
|
||||
*/
|
||||
private Integer orderBy;
|
||||
|
||||
/**
|
||||
* 语言(可选,默认中文,传"en"返回英文)
|
||||
*/
|
||||
private String language;
|
||||
|
||||
/**
|
||||
* 签名(必填)
|
||||
*/
|
||||
private String signature;
|
||||
|
||||
public void buildSignature(String key) {
|
||||
String signature = Md5Utils.md5New(Md5Utils.md5New(merchantCode + "&" + startTime + "&" + endTime + "&" + timestamp) + "&" + key);
|
||||
this.signature = signature;
|
||||
}
|
||||
}
|
||||
|
|
@ -0,0 +1,199 @@
|
|||
package com.ff.game.api.db.dto;
|
||||
|
||||
import lombok.Data;
|
||||
|
||||
import java.io.Serializable;
|
||||
import java.math.BigDecimal;
|
||||
import java.util.List;
|
||||
|
||||
/**
|
||||
* @author cengy
|
||||
*/
|
||||
@Data
|
||||
public class GetBetListResponse implements Serializable {
|
||||
|
||||
private static final long serialVersionUID = 1L;
|
||||
|
||||
private Boolean status;
|
||||
private String msg;
|
||||
private String code;
|
||||
private Long serverTime;
|
||||
private DataDTO data;
|
||||
|
||||
@Data
|
||||
public static class DataDTO {
|
||||
|
||||
|
||||
// 当前页码
|
||||
private Integer pageNum;
|
||||
// 每页条数
|
||||
private Integer pageSize;
|
||||
// 总条数
|
||||
private Integer totalCount;
|
||||
// 注单列表
|
||||
private List<OrderItemDTO> list;
|
||||
}
|
||||
|
||||
@Data
|
||||
public static class OrderItemDTO {
|
||||
// 用户名
|
||||
private String userName;
|
||||
|
||||
// 商户编码
|
||||
private String merchantCode;
|
||||
|
||||
// 订单ID
|
||||
private String orderNo;
|
||||
|
||||
// 订单状态,具体见参数字段映射
|
||||
private Integer orderStatus;
|
||||
|
||||
// 投注时间(13位时间戳)
|
||||
private Long createTime;
|
||||
|
||||
// 订单更新时间(13位时间戳)
|
||||
private Long modifyTime;
|
||||
|
||||
// 实际投注金额
|
||||
private String orderAmount;
|
||||
|
||||
// 注单项数量
|
||||
private Integer betCount;
|
||||
|
||||
// 结算时间(13位时间戳)
|
||||
private Long settleTime;
|
||||
|
||||
// 结算金额
|
||||
private Double settleAmount;
|
||||
|
||||
// 提前结算投注金额
|
||||
private Double preBetAmount;
|
||||
|
||||
// 盈利金额
|
||||
private Double profitAmount;
|
||||
|
||||
// 注单结算结果
|
||||
// 2:走水,3:输,4:赢,5:赢半,6:输半,7:赛事取消,8:赛事延期
|
||||
private Integer outcome;
|
||||
|
||||
// 串关类型
|
||||
private Integer seriesType;
|
||||
|
||||
// 串关值
|
||||
private String seriesValue;
|
||||
|
||||
// 结算次数
|
||||
private Integer settleTimes;
|
||||
|
||||
// 设备类型:1-H5,2-PC,3-Android,4-IOS
|
||||
private String deviceType;
|
||||
|
||||
// 移动设备标识
|
||||
private String deviceImei;
|
||||
|
||||
// 用户IP地址
|
||||
private String ip;
|
||||
|
||||
// 币种
|
||||
private String currency;
|
||||
|
||||
// 汇率
|
||||
private BigDecimal exchangeRate;
|
||||
|
||||
// 最大中奖金额
|
||||
private Double maxWinAmount;
|
||||
|
||||
// VIP等级
|
||||
private Integer vipLevel;
|
||||
|
||||
// 投注前余额
|
||||
private BigDecimal beforeTransfer;
|
||||
|
||||
// 投注后余额
|
||||
private BigDecimal afterTransfer;
|
||||
|
||||
// 有效投注金额
|
||||
private BigDecimal validOrderAmount;
|
||||
|
||||
// 注单详情列表
|
||||
private List<DetailItemDTO> detailList;
|
||||
}
|
||||
|
||||
@Data
|
||||
public static class DetailItemDTO {
|
||||
// 投注项编号
|
||||
private Long betNo;
|
||||
|
||||
// 投注项ID
|
||||
private Long playOptionsId;
|
||||
|
||||
// 赛事ID
|
||||
private Long matchId;
|
||||
|
||||
// 比赛开始时间(13位时间戳)
|
||||
private Long beginTime;
|
||||
|
||||
// 注单金额
|
||||
private Double betAmount;
|
||||
|
||||
// 联赛名称
|
||||
private String matchName;
|
||||
|
||||
// 比赛对阵
|
||||
private String matchInfo;
|
||||
|
||||
// 投注类型:
|
||||
// 1:早盘,2:滚球盘,3:冠军盘,4:虚拟赛事,5:电竞赛事
|
||||
private Integer matchType;
|
||||
|
||||
// 赛种ID
|
||||
private Integer sportId;
|
||||
|
||||
// 玩法ID
|
||||
private Integer playId;
|
||||
|
||||
// 投注项(如主客队)
|
||||
private String playOptions;
|
||||
|
||||
// 游戏名称
|
||||
private String sportName;
|
||||
|
||||
// 联赛ID
|
||||
private Long tournamentId;
|
||||
|
||||
// 投注项名称
|
||||
private String playOptionName;
|
||||
|
||||
// 玩法名称
|
||||
private String playName;
|
||||
|
||||
// 盘口类型
|
||||
private String marketType;
|
||||
|
||||
// 盘口值
|
||||
private String marketValue;
|
||||
|
||||
// 让球值
|
||||
private BigDecimal handicap;
|
||||
|
||||
// 结算比分(我方处理后所得,数据商可能未提供)
|
||||
private String settleScore;
|
||||
|
||||
// 基准分
|
||||
private String scoreBenchmark;
|
||||
|
||||
// 当前赔率(欧洲盘表示)
|
||||
private BigDecimal oddsValue;
|
||||
|
||||
// 注单结算结果:
|
||||
// 0:无结果,2:走水,3:输,4:赢,5:赢一半,6:输一半,
|
||||
// 7:赛事取消,8:赛事延期,11:比赛延迟,12:比赛中断,
|
||||
// 13:未知,15:比赛放弃,16:异常盘口,17:未知状态,
|
||||
// 18:比赛取消,19:比赛延期
|
||||
private String betResult;
|
||||
|
||||
// 最终赔率(按盘口类型)
|
||||
private BigDecimal oddFinally;
|
||||
}
|
||||
|
||||
}
|
||||
|
|
@ -0,0 +1,36 @@
|
|||
package com.ff.game.api.db.dto;
|
||||
|
||||
import com.ff.base.utils.sign.Md5Utils;
|
||||
import lombok.Data;
|
||||
|
||||
import java.io.Serializable;
|
||||
|
||||
/**
|
||||
* @author cengy
|
||||
*/
|
||||
@Data
|
||||
public class GetMemberInfoRequest implements Serializable {
|
||||
private static final long serialVersionUID = 1L;
|
||||
|
||||
/**
|
||||
* 用户名,不能为空
|
||||
*/
|
||||
private String userName;
|
||||
|
||||
/**
|
||||
* 商户编码
|
||||
*/
|
||||
private String merchantCode;
|
||||
/**
|
||||
* Long型时间戳(13位)
|
||||
*/
|
||||
private String timestamp = System.currentTimeMillis() + "";
|
||||
|
||||
private String signature;
|
||||
|
||||
public void buildSignature(String key) {
|
||||
|
||||
String signature = Md5Utils.md5New(Md5Utils.md5New(merchantCode + "&" + userName + "&" + timestamp) + "&" + key);
|
||||
this.signature = signature;
|
||||
}
|
||||
}
|
||||
|
|
@ -0,0 +1,27 @@
|
|||
package com.ff.game.api.db.dto;
|
||||
|
||||
import lombok.Data;
|
||||
|
||||
import java.io.Serializable;
|
||||
import java.math.BigDecimal;
|
||||
import java.util.List;
|
||||
|
||||
/**
|
||||
* @author cengy
|
||||
*/
|
||||
@Data
|
||||
public class GetMemberInfoResponse implements Serializable {
|
||||
private static final long serialVersionUID = 1L;
|
||||
|
||||
private Boolean status;
|
||||
private String msg;
|
||||
private String code;
|
||||
private Long serverTime;
|
||||
private MemberInfoDTO data;
|
||||
|
||||
@Data
|
||||
public static class MemberInfoDTO {
|
||||
private BigDecimal balance;
|
||||
private String userName;
|
||||
}
|
||||
}
|
||||
|
|
@ -0,0 +1,24 @@
|
|||
package com.ff.game.api.db.dto;
|
||||
|
||||
import com.ff.base.utils.sign.Md5Utils;
|
||||
import lombok.Data;
|
||||
|
||||
import java.io.Serializable;
|
||||
|
||||
/**
|
||||
* @author cengy
|
||||
*/
|
||||
@Data
|
||||
public class KickUserRequest implements Serializable {
|
||||
|
||||
private static final long serialVersionUID = 1L;
|
||||
private String userName;
|
||||
private String merchantCode;
|
||||
private String timestamp = System.currentTimeMillis() + "";
|
||||
private String signature;
|
||||
|
||||
public void buildSignature(String key) {
|
||||
String signature = Md5Utils.md5New(Md5Utils.md5New(merchantCode + "&" + userName + "&" + timestamp) + "&" + key);
|
||||
this.signature = signature;
|
||||
}
|
||||
}
|
||||
|
|
@ -0,0 +1,20 @@
|
|||
package com.ff.game.api.db.dto;
|
||||
|
||||
import lombok.Data;
|
||||
|
||||
import java.io.Serializable;
|
||||
|
||||
/**
|
||||
* @author cengy
|
||||
*/
|
||||
@Data
|
||||
public class KickUserResponse implements Serializable {
|
||||
|
||||
private static final long serialVersionUID = 1L;
|
||||
|
||||
private Boolean status;
|
||||
private String msg;
|
||||
private String code;
|
||||
private Long serverTime;
|
||||
|
||||
}
|
||||
|
|
@ -0,0 +1,57 @@
|
|||
package com.ff.game.api.db.dto;
|
||||
|
||||
import com.ff.base.utils.sign.Md5Utils;
|
||||
import lombok.Data;
|
||||
|
||||
import java.io.Serializable;
|
||||
import java.math.BigDecimal;
|
||||
|
||||
/**
|
||||
* @author cengy
|
||||
*/
|
||||
@Data
|
||||
public class LoginRequest implements Serializable {
|
||||
|
||||
private static final long serialVersionUID = 1L;
|
||||
private String userName;
|
||||
private String merchantCode;
|
||||
private String timestamp = System.currentTimeMillis() + "";
|
||||
private String signature;
|
||||
|
||||
// 不能传错,用户可能受到设备类型相关风控措施的错误限制,进而影响正常用户货量,并产生客诉
|
||||
private String terminal; // 终端类型:【电脑传值:pc】,【移动设备传值:mobile】 注:这个参数传值必须是pc或者mobile,
|
||||
private BigDecimal balance; // 用户余额,N
|
||||
private String currency; // 币种(见参数映射:支持币种 )会员首次登录,必须填写币种参数,否则注册失败
|
||||
|
||||
private String callbackUrl; // 玩家会话失效跳转的商户地址url(非必传)
|
||||
private String stoken; // 非必传字段(商户方用户会话)
|
||||
|
||||
// 非必传字段(支持体育游戏其他端的跳转) ,
|
||||
// C端⽀持跳转的游戏,如果C端⽀持跳转多个游戏 ,
|
||||
// 则使⽤逗号区分。 具体字段可查看:参数字段映射第6条 参数字段映射
|
||||
private String jumpsupport;
|
||||
private String jumpfrom; // 非必传字段,同上
|
||||
|
||||
private String agentId; // 信用网(代理id),N
|
||||
// 用户语种:
|
||||
//zh:中文
|
||||
//en:英文
|
||||
//vi:越南语
|
||||
//tw:中文繁体
|
||||
//th:泰语
|
||||
//ms:马来语
|
||||
//ad:印尼语
|
||||
//ko:韩语
|
||||
//mya:缅甸语
|
||||
//pt:葡萄牙语
|
||||
//es:西班牙语
|
||||
//非必传字段
|
||||
private String language;
|
||||
private String ip; // 非必传字段 说明:商户端在该字段上传入用户登陆时端ip
|
||||
|
||||
public void buildSignature(String key) {
|
||||
String signature = Md5Utils.md5New(Md5Utils.md5New(merchantCode + "&" + userName + "&" + terminal + "&" + timestamp) + "&" + key);
|
||||
|
||||
this.signature = signature;
|
||||
}
|
||||
}
|
||||
|
|
@ -0,0 +1,34 @@
|
|||
package com.ff.game.api.db.dto;
|
||||
|
||||
import lombok.Data;
|
||||
|
||||
import java.io.Serializable;
|
||||
import java.util.List;
|
||||
|
||||
/**
|
||||
* @author cengy
|
||||
*/
|
||||
@Data
|
||||
public class LoginResponse implements Serializable {
|
||||
|
||||
private static final long serialVersionUID = 1L;
|
||||
|
||||
private Boolean status;
|
||||
private String msg;
|
||||
private String code;
|
||||
private Long serverTime;
|
||||
private LoginRespDTO data;
|
||||
|
||||
@Data
|
||||
public static class LoginRespDTO {
|
||||
private String domain; // 体育游戏前端URL
|
||||
private String token; // 带有登录状态的token
|
||||
private String apiDomain;// 赛事API的域名(若没有对接赛事API,为空)
|
||||
private String imgDomain; // 静态资源域名
|
||||
private String loginUrl; // 登录体育URL,可直接跳转
|
||||
private String userId; // 用户id
|
||||
private String url; // 参加活动的商户使用,客户端域名和参数拼接后提供商户使用
|
||||
private List<String> loginUrlArr; // loginUrl数组,多个域名,调试使用
|
||||
}
|
||||
|
||||
}
|
||||
|
|
@ -0,0 +1,38 @@
|
|||
package com.ff.game.api.db.dto;
|
||||
|
||||
import com.ff.base.utils.sign.Md5Utils;
|
||||
import lombok.Data;
|
||||
|
||||
import java.io.Serializable;
|
||||
|
||||
/**
|
||||
* @author cengy
|
||||
*/
|
||||
@Data
|
||||
public class TransferDetailRequest implements Serializable {
|
||||
|
||||
/**
|
||||
* 用户名,N
|
||||
*/
|
||||
private String userName;
|
||||
/**
|
||||
* 商户code
|
||||
*/
|
||||
private String merchantCode;
|
||||
/**
|
||||
* 交易id(19位数字)
|
||||
*/
|
||||
private String transferId;
|
||||
|
||||
private String timestamp = System.currentTimeMillis() + "";
|
||||
|
||||
/**
|
||||
* 签名
|
||||
*/
|
||||
private String signature;
|
||||
|
||||
public void buildSignature(String key) {
|
||||
String signature = Md5Utils.md5New(Md5Utils.md5New(merchantCode + "&" + transferId + "&" + timestamp) + "&" + key);
|
||||
this.signature = signature;
|
||||
}
|
||||
}
|
||||
|
|
@ -0,0 +1,39 @@
|
|||
package com.ff.game.api.db.dto;
|
||||
|
||||
import lombok.Data;
|
||||
|
||||
import java.io.Serializable;
|
||||
import java.math.BigDecimal;
|
||||
|
||||
/**
|
||||
* @author cengy
|
||||
*/
|
||||
@Data
|
||||
public class TransferDetailResponse implements Serializable {
|
||||
private static final long serialVersionUID = 1L;
|
||||
|
||||
private TransferDetailDTO data;
|
||||
private Boolean status;
|
||||
private String msg;
|
||||
private String code;
|
||||
private Long serverTime;
|
||||
|
||||
@Data
|
||||
public static class TransferDetailDTO implements Serializable {
|
||||
private static final long serialVersionUID = 1L;
|
||||
|
||||
private String transferId; // 交易id
|
||||
private String merchantCode; // 商户代码
|
||||
private Long userId; // 用户id
|
||||
private Integer transferType; // 交易类型 1:加款,2:扣款
|
||||
private BigDecimal amount; // 交易金额
|
||||
private BigDecimal beforeTransfer; // 转账前余额
|
||||
private Integer afterTransfer; // 转账后余额
|
||||
private Integer status; // 转账成功与否(0:失败,1:成功)
|
||||
private String mag; // 转账模式 1:免转,2:转账
|
||||
private Integer transferMode; // 转账涉及订单(transferMode为2时,该字段为空)
|
||||
private Long createTime; // 交易时间
|
||||
|
||||
}
|
||||
|
||||
}
|
||||
|
|
@ -0,0 +1,28 @@
|
|||
package com.ff.game.api.db.dto;
|
||||
|
||||
import com.ff.base.utils.sign.Md5Utils;
|
||||
import lombok.Data;
|
||||
|
||||
import java.io.Serializable;
|
||||
|
||||
/**
|
||||
* @author cengy
|
||||
*/
|
||||
@Data
|
||||
public class TransferRequest implements Serializable {
|
||||
|
||||
private String userName;
|
||||
private String merchantCode;
|
||||
private int transferType; // 1:加款 2:扣款
|
||||
|
||||
private String amount; // 金额,小数2位
|
||||
private String transferId; // 交易的讯息号,唯一标示,不可重复,19位长度的字符串
|
||||
private String timestamp = String.valueOf(System.currentTimeMillis());
|
||||
private String signature;
|
||||
|
||||
public void buildSignature(String key) {
|
||||
String signature = Md5Utils.md5New(Md5Utils.md5New(merchantCode + "&" + userName + "&" + transferType + "&" + amount + "&" + transferId + "&" + timestamp) + "&" + key);
|
||||
this.signature = signature;
|
||||
}
|
||||
|
||||
}
|
||||
|
|
@ -0,0 +1,25 @@
|
|||
package com.ff.game.api.db.dto;
|
||||
|
||||
import lombok.Data;
|
||||
|
||||
import java.io.Serializable;
|
||||
|
||||
/**
|
||||
* @author cengy
|
||||
*/
|
||||
@Data
|
||||
public class TransferResponse implements Serializable {
|
||||
|
||||
private static final long serialVersionUID = 1L;
|
||||
|
||||
private Boolean status;
|
||||
private String msg;
|
||||
private String code;
|
||||
private Long serverTime;
|
||||
private TransferDTO data;
|
||||
|
||||
@Data
|
||||
public static class TransferDTO {
|
||||
private String userName;
|
||||
}
|
||||
}
|
||||
|
|
@ -0,0 +1,609 @@
|
|||
package com.ff.game.api.db.impl;
|
||||
|
||||
import cn.hutool.core.util.IdUtil;
|
||||
import com.ff.base.constant.CacheConstants;
|
||||
import com.ff.base.constant.Constants;
|
||||
import com.ff.base.core.redis.RedisCache;
|
||||
import com.ff.base.enums.*;
|
||||
import com.ff.base.exception.base.ApiException;
|
||||
import com.ff.base.exception.base.BaseException;
|
||||
import com.ff.base.utils.DateUtils;
|
||||
import com.ff.base.utils.StringUtils;
|
||||
import com.ff.base.utils.sign.Md5Utils;
|
||||
import com.ff.base.utils.uuid.IdUtils;
|
||||
import com.ff.game.api.IGamesService;
|
||||
import com.ff.game.api.db.dto.*;
|
||||
import com.ff.game.api.request.*;
|
||||
import com.ff.game.domain.*;
|
||||
import com.ff.game.service.IGameBettingDetailsService;
|
||||
import com.ff.game.service.IGameExchangeMoneyService;
|
||||
import com.ff.game.service.IGameService;
|
||||
import com.ff.member.domain.Member;
|
||||
import com.ff.member.service.IMemberService;
|
||||
import com.ff.game.api.db.client.DBSportsClient;
|
||||
import lombok.extern.slf4j.Slf4j;
|
||||
import org.springframework.stereotype.Service;
|
||||
import org.springframework.transaction.annotation.Transactional;
|
||||
import org.springframework.util.CollectionUtils;
|
||||
import org.springframework.util.ObjectUtils;
|
||||
|
||||
import javax.annotation.Resource;
|
||||
import java.math.BigDecimal;
|
||||
import java.util.ArrayList;
|
||||
import java.util.Collections;
|
||||
import java.util.List;
|
||||
import java.util.Objects;
|
||||
import java.util.stream.Collectors;
|
||||
|
||||
|
||||
/**
|
||||
* DB体育
|
||||
*
|
||||
* @author cengy
|
||||
* @date 2024/10/21
|
||||
*/
|
||||
@Service("DBSportsService")
|
||||
@Slf4j
|
||||
public class DBSportsServiceImpl implements IGamesService {
|
||||
|
||||
@Resource
|
||||
private RedisCache redisCache;
|
||||
|
||||
@Resource
|
||||
private IGameExchangeMoneyService gameExchangeMoneyService;
|
||||
|
||||
@Resource
|
||||
private IGameService gameService;
|
||||
|
||||
|
||||
@Resource
|
||||
private IMemberService memberService;
|
||||
|
||||
@Resource
|
||||
private DBSportsClient dbSportsClient;
|
||||
|
||||
@Resource
|
||||
private IGameBettingDetailsService gameBettingDetailsService;
|
||||
|
||||
/**
|
||||
* 获得就是成功
|
||||
*
|
||||
* @param errorCode 错误代码
|
||||
* @return {@link Boolean }
|
||||
*/
|
||||
private Boolean isSuccess(String errorCode) {
|
||||
return "0000".equals(errorCode);
|
||||
}
|
||||
|
||||
String getSign(String bodyJsonString, String merchantId, String merchantApiSecret, long requestTimestamp) {
|
||||
|
||||
String stringThatNeedsToBeSigned = bodyJsonString + "." + merchantId + "." + requestTimestamp + "." + merchantApiSecret;
|
||||
String sign = Md5Utils.md5New(stringThatNeedsToBeSigned);
|
||||
return sign;
|
||||
}
|
||||
|
||||
/**
|
||||
* 创建成员
|
||||
*
|
||||
* @param requestDTO 创建成员请求dto
|
||||
* @return {@link Boolean }
|
||||
*/
|
||||
@Override
|
||||
public Boolean createMember(CreateMemberRequestDTO requestDTO) {
|
||||
|
||||
CreateUserRequest request = new CreateUserRequest();
|
||||
request.setUserName(requestDTO.getAccount());
|
||||
request.setMerchantCode(requestDTO.getAgentId());
|
||||
request.setCurrency(requestDTO.getCurrency());
|
||||
request.buildSignature(requestDTO.getAgentKey());
|
||||
|
||||
//String lang = requestDTO.getLan
|
||||
String requestId = IdUtils.fastUUID();
|
||||
CreateUserResponse response = dbSportsClient.createMember(request, requestId);
|
||||
if (isSuccess(response.getCode())) {
|
||||
return Boolean.TRUE;
|
||||
}
|
||||
|
||||
log.error("创建会员失败, errorCode:{}, errorMessage:{}", response.getCode(), response.getMsg());
|
||||
throw new ApiException(ErrorCode.Create_Member_Failure.getCode());
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* 按代理id进行交换转账
|
||||
*
|
||||
* @param requestDTO 外汇转账
|
||||
* @return {@link Long }
|
||||
*/
|
||||
@Override
|
||||
@Transactional
|
||||
public Long exchangeTransferByAgentId(ExchangeTransferMoneyRequestDTO requestDTO) {
|
||||
|
||||
GameExchangeMoney exchangeMoney = gameExchangeMoneyService.selectGameExchangeMoneyById(requestDTO.getGameExchangeId());
|
||||
// 转入
|
||||
if (requestDTO.getTransferType().equals(TransferType.GAMES.getCode())) {
|
||||
TransferRequest request = new TransferRequest();
|
||||
request.setUserName(requestDTO.getAccount());
|
||||
request.setTransferType(1);
|
||||
request.setTransferId(requestDTO.getTransactionId());
|
||||
request.setMerchantCode(requestDTO.getAgentId());
|
||||
request.setAmount(requestDTO.getAmount().toString());
|
||||
request.buildSignature(requestDTO.getAgentKey());
|
||||
|
||||
TransferResponse response = dbSportsClient.transferIn(
|
||||
request, IdUtils.fastUUID()
|
||||
);
|
||||
if (isSuccess(response.getCode())) {
|
||||
GetMemberInfoRequest queryMemberRequest = new GetMemberInfoRequest();
|
||||
queryMemberRequest.setUserName(requestDTO.getAccount());
|
||||
queryMemberRequest.setMerchantCode(requestDTO.getAgentId());
|
||||
queryMemberRequest.buildSignature(requestDTO.getAgentKey());
|
||||
String requestId = IdUtils.fastUUID();
|
||||
try {
|
||||
GetMemberInfoResponse queryMemberResponse = dbSportsClient.getMemberInfo(queryMemberRequest, requestId);
|
||||
if (this.isSuccess(queryMemberResponse.getCode())) {
|
||||
BigDecimal transAmount = requestDTO.getAmount();
|
||||
BigDecimal afterAmount = queryMemberResponse.getData().getBalance();
|
||||
BigDecimal beforeAmount = afterAmount.subtract(transAmount);
|
||||
exchangeMoney.setBalance(transAmount);
|
||||
exchangeMoney.setCoinBefore(beforeAmount);
|
||||
exchangeMoney.setCoinAfter(afterAmount);
|
||||
exchangeMoney.setCurrencyBefore(beforeAmount);
|
||||
exchangeMoney.setCurrencyAfter(afterAmount);
|
||||
}
|
||||
} catch (Exception e) {
|
||||
log.error("查询会员失败, errorCode:{}, errorMessage:{}", response.getCode(), response.getMsg(), e);
|
||||
}
|
||||
exchangeMoney.setStep(GameExchangeStep.PLATFORM_TRANSACTION.getCode());
|
||||
exchangeMoney.setStepStatus(GameExchangeStepStatus.SUCCESS.getCode());
|
||||
gameExchangeMoneyService.updateGameExchangeMoney(exchangeMoney);
|
||||
} else {
|
||||
exchangeMoney.setStep(GameExchangeStep.PLATFORM_TRANSACTION.getCode());
|
||||
exchangeMoney.setStepStatus(GameExchangeStepStatus.FAILURE.getCode());
|
||||
gameExchangeMoneyService.updateGameExchangeMoney(exchangeMoney);
|
||||
throw new ApiException(ErrorCode.Transfer_In_Failure.getCode());
|
||||
}
|
||||
} else {
|
||||
// 获取第三方钱包余额
|
||||
MemberInfoRequestDTO memberInfoRequestDTO = MemberInfoRequestDTO.builder()
|
||||
.accounts(requestDTO.getAccount())
|
||||
.agentId(requestDTO.getAgentId())
|
||||
.agentKey(requestDTO.getAgentKey())
|
||||
.build();
|
||||
BigDecimal balance = this.getMemberInfo(memberInfoRequestDTO).getBalance();
|
||||
if (balance.compareTo(BigDecimal.ZERO) <= 0) {
|
||||
throw new ApiException(ErrorCode.INSUFFICIENT_PLAYER_BALANCE.getCode());
|
||||
}
|
||||
|
||||
TransferRequest request = new TransferRequest();
|
||||
request.setUserName(requestDTO.getAccount());
|
||||
request.setTransferType(2); // 转出
|
||||
request.setTransferId(requestDTO.getTransactionId());
|
||||
request.setMerchantCode(requestDTO.getAgentId());
|
||||
request.setAmount(/*requestDTO.getAmount().toString()*/ balance.toString());
|
||||
request.buildSignature(requestDTO.getAgentKey());
|
||||
|
||||
TransferResponse response = dbSportsClient
|
||||
.transferOut(
|
||||
request, IdUtils.fastUUID()
|
||||
);
|
||||
|
||||
//判断是否转移成功
|
||||
if (this.isSuccess(response.getCode())) {
|
||||
BigDecimal transAmount = balance;
|
||||
BigDecimal beforeAmount = balance;
|
||||
BigDecimal afterAmount = BigDecimal.ZERO;
|
||||
|
||||
//更新数据
|
||||
exchangeMoney.setBalance(transAmount);
|
||||
exchangeMoney.setCoinBefore(beforeAmount);
|
||||
exchangeMoney.setCoinAfter(afterAmount);
|
||||
exchangeMoney.setCurrencyBefore(beforeAmount);
|
||||
exchangeMoney.setCurrencyAfter(afterAmount);
|
||||
exchangeMoney.setStep(GameExchangeStep.PLATFORM_TRANSACTION.getCode());
|
||||
exchangeMoney.setStepStatus(GameExchangeStepStatus.SUCCESS.getCode());
|
||||
gameExchangeMoneyService.updateGameExchangeMoney(exchangeMoney);
|
||||
} else {
|
||||
exchangeMoney.setStep(GameExchangeStep.PLATFORM_TRANSACTION.getCode());
|
||||
exchangeMoney.setStepStatus(GameExchangeStepStatus.FAILURE.getCode());
|
||||
gameExchangeMoneyService.updateGameExchangeMoney(exchangeMoney);
|
||||
throw new ApiException(ErrorCode.Transfer_Out_Failure.getCode());
|
||||
}
|
||||
}
|
||||
return exchangeMoney.getId();
|
||||
}
|
||||
|
||||
/**
|
||||
* 获取交易id
|
||||
*
|
||||
* @param transactionIdRequestDTO 事务id请求dto
|
||||
* @return {@link String }
|
||||
*/
|
||||
@Override
|
||||
public String getTransactionId(TransactionIdRequestDTO transactionIdRequestDTO) {
|
||||
return gameExchangeMoneyService.getTransactionId(GamePlatforms.DBSports.getInfo(), 11);
|
||||
}
|
||||
|
||||
/**
|
||||
* 获取会员信息
|
||||
*
|
||||
* @param requestDTO 会员信息请求dto
|
||||
* @return {@link MemberInfoResponseDTO }
|
||||
*/
|
||||
@Override
|
||||
public MemberInfoResponseDTO getMemberInfo(MemberInfoRequestDTO requestDTO) {
|
||||
GetMemberInfoRequest request = new GetMemberInfoRequest();
|
||||
request.setUserName(requestDTO.getAccounts());
|
||||
request.setMerchantCode(requestDTO.getAgentId());
|
||||
request.buildSignature(requestDTO.getAgentKey());
|
||||
String requestId = IdUtils.fastUUID();
|
||||
GetMemberInfoResponse response = dbSportsClient.getMemberInfo(request, requestId);
|
||||
//判断是否获取成功
|
||||
if (this.isSuccess(response.getCode())) {
|
||||
return MemberInfoResponseDTO.builder()
|
||||
.status(GameMemberStatus.UNKNOWN.getCode())
|
||||
.balance(response.getData().getBalance())
|
||||
.account(requestDTO.getAccounts())
|
||||
.build();
|
||||
}
|
||||
throw new ApiException(ErrorCode.Get_Member_Info_Failure.getCode());
|
||||
}
|
||||
|
||||
/**
|
||||
* 无重定向登录
|
||||
*
|
||||
* @param requestDTO 游戏登录
|
||||
* @return {@link String }
|
||||
*/
|
||||
@Override
|
||||
public String loginWithoutRedirect(GamesLogin requestDTO) {
|
||||
LoginRequest request = new LoginRequest();
|
||||
request.setUserName(requestDTO.getAccount());
|
||||
request.setMerchantCode(requestDTO.getAgentId());
|
||||
if (requestDTO.getPlatform().equalsIgnoreCase("web")) {
|
||||
request.setTerminal("pc");
|
||||
} else {
|
||||
request.setTerminal("mobile");
|
||||
}
|
||||
request.setLanguage(requestDTO.getLang());
|
||||
request.setCurrency(requestDTO.getCurrency());
|
||||
|
||||
request.buildSignature(requestDTO.getAgentKey());
|
||||
|
||||
LoginResponse response = dbSportsClient.login(
|
||||
request, IdUtils.fastUUID()
|
||||
);
|
||||
|
||||
if (this.isSuccess(response.getCode())) {
|
||||
LoginResponse.LoginRespDTO respDTO = response.getData();
|
||||
|
||||
String loginURL = respDTO.getLoginUrl();
|
||||
if (StringUtils.isEmpty(loginURL)) {
|
||||
throw new ApiException(ErrorCode.Get_Url_Failure.getCode());
|
||||
}
|
||||
|
||||
return loginURL;
|
||||
}
|
||||
throw new ApiException(ErrorCode.Get_Url_Failure.getCode());
|
||||
}
|
||||
|
||||
/**
|
||||
* 获取游戏列表
|
||||
*
|
||||
* @param gamesBaseRequestDTO 游戏请求dto
|
||||
* @return {@link String }
|
||||
*/
|
||||
@Transactional
|
||||
@Override
|
||||
public String getGameList(GamesBaseRequestDTO gamesBaseRequestDTO) {
|
||||
|
||||
Platform platform = gamesBaseRequestDTO.getVendor();
|
||||
Game condition = new Game();
|
||||
condition.setPlatformCode(platform.getPlatformCode());
|
||||
condition.setPlatformType(PlatformType.SPORTS.getCode());
|
||||
List<Game> gameList = gameService.selectGameList(condition);
|
||||
//不存在这个游戏
|
||||
if (ObjectUtils.isEmpty(gameList)) {
|
||||
Game game = new Game();
|
||||
game.setId(IdUtil.getSnowflakeNextId());
|
||||
game.setSortNo(1);
|
||||
game.setPlatformCode(platform.getPlatformCode());
|
||||
game.setPlatformType(PlatformType.SPORTS.getCode());
|
||||
game.setGameCode("1");
|
||||
game.setGameSourceType(String.valueOf(1));
|
||||
game.setGameName(GamePlatforms.DBSports.getInfo());
|
||||
game.setCreateBy(Constants.SYSTEM);
|
||||
NameInfo nameInfo = new NameInfo();
|
||||
nameInfo.setLang("zh-CN");
|
||||
nameInfo.setName("DB体育");
|
||||
game.setNameInfo(Collections.singletonList(nameInfo));
|
||||
gameService.insertGame(game);
|
||||
}
|
||||
/*GameName gameName = gameNameService.selectGameNameById(GAME_NAME_ID);
|
||||
if (ObjectUtils.isEmpty(gameName)) {
|
||||
gameNameService.insertGameName(GameName.builder()
|
||||
.id(GAME_NAME_ID)
|
||||
.gameId(game.getId())
|
||||
.gameName(game.getGameName())
|
||||
.langCode("zh-CN")
|
||||
.createBy(Constants.SYSTEM)
|
||||
.build());
|
||||
}*/
|
||||
|
||||
return CacheConstants.DB_Sports;
|
||||
}
|
||||
|
||||
/**
|
||||
* 汇兑转移状态
|
||||
*
|
||||
* @param requestDTO 兑换转账请求dto
|
||||
* @return {@link Boolean }
|
||||
*/
|
||||
@Override
|
||||
public ExchangeTransferStatusResponseDTO exchangeTransferStatus(ExchangeTransferStatusRequestDTO requestDTO) {
|
||||
|
||||
GameExchangeMoney gameExchangeMoney = gameExchangeMoneyService.selectGameExchangeMoneyById(requestDTO.getGameExchangeMoneyId());
|
||||
if (null == gameExchangeMoney) {
|
||||
throw new ApiException(ErrorCode.Transfer_Not_Exist.getCode());
|
||||
}
|
||||
Integer status = StatusType.IN_PROGRESS.getValue();
|
||||
|
||||
if (!Objects.equals(gameExchangeMoney.getStatus(), StatusType.SUCCESS.getValue())) {
|
||||
TransferDetailRequest request = new TransferDetailRequest();
|
||||
request.setMerchantCode(requestDTO.getAgentId());
|
||||
request.setTransferId(gameExchangeMoney.getOrderId());
|
||||
request.buildSignature(requestDTO.getAgentKey());
|
||||
TransferDetailResponse response = dbSportsClient.transferDetail(
|
||||
request, IdUtils.fastUUID()
|
||||
);
|
||||
if (this.isSuccess(response.getCode()) && response.getData().getStatus() == 1) {
|
||||
status = StatusType.SUCCESS.getValue();
|
||||
} else {
|
||||
status = StatusType.FAILURE.getValue();
|
||||
}
|
||||
}
|
||||
|
||||
return ExchangeTransferStatusResponseDTO.builder()
|
||||
.statusType(status)
|
||||
.balance(gameExchangeMoney.getBalance())
|
||||
.coinBefore(gameExchangeMoney.getCoinBefore())
|
||||
.coinAfter(gameExchangeMoney.getCoinAfter())
|
||||
.build();
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* 按时间获取投注记录
|
||||
*
|
||||
* @param requestDTO 按时间dto投注记录
|
||||
* @return {@link Boolean }
|
||||
*/
|
||||
@Override
|
||||
public Boolean getBetRecordByTime(BetRecordByTimeDTO requestDTO) {
|
||||
|
||||
this.getRealtimeRecord(requestDTO, 1);
|
||||
|
||||
return Boolean.TRUE;
|
||||
}
|
||||
|
||||
void getRealtimeRecord(BetRecordByTimeDTO requestDTO, int pageNum) {
|
||||
|
||||
GetBetListRequest request = new GetBetListRequest();
|
||||
request.setStartTime(String.valueOf(requestDTO.getStartTime()));
|
||||
request.setEndTime(String.valueOf(requestDTO.getEndTime()));
|
||||
request.setMerchantCode(requestDTO.getAgentId());
|
||||
request.setPageNum(pageNum);
|
||||
request.setPageSize(1000);
|
||||
request.buildSignature(requestDTO.getAgentKey());
|
||||
|
||||
GetBetListResponse response = dbSportsClient.getBetList(
|
||||
request, IdUtils.fastUUID()
|
||||
);
|
||||
|
||||
if (this.isSuccess(response.getCode())) {
|
||||
List<GetBetListResponse.OrderItemDTO> list = response.getData().getList();
|
||||
if (CollectionUtils.isEmpty(list)) {
|
||||
return;
|
||||
}
|
||||
this.batchInsert(list, requestDTO);
|
||||
getRealtimeRecord(requestDTO, ++pageNum);
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* 按历史时间获取投注记录
|
||||
*
|
||||
* @param requestDTO 按时间dto投注记录
|
||||
* @return {@link Boolean }
|
||||
*/
|
||||
@Override
|
||||
public Boolean getBetRecordByHistoryTime(BetRecordByTimeDTO requestDTO) {
|
||||
|
||||
return Boolean.TRUE;
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* 赠送免费局数
|
||||
*
|
||||
* @param createFreeSpinRequest 创建自由旋转请求
|
||||
* @return {@link Boolean }
|
||||
*/
|
||||
@Override
|
||||
public Boolean createFreeSpin(CreateFreeSpinRequestDTO createFreeSpinRequest) {
|
||||
throw new BaseException("暂不支持免费局数");
|
||||
}
|
||||
|
||||
/**
|
||||
* 获取游戏详细信息
|
||||
*
|
||||
* @param getGameDetailRequestDTO 获取游戏详细信息请求dto
|
||||
* @return {@link GetGameDetailResponseDTO }
|
||||
*/
|
||||
@Override
|
||||
public GetGameDetailResponseDTO getGameDetail(GetGameDetailRequestDTO getGameDetailRequestDTO) {
|
||||
throw new ApiException(ErrorCode.PLATFORM_NOT_METHODS.getCode());
|
||||
}
|
||||
|
||||
/**
|
||||
* 强制会员从游戏注销
|
||||
*
|
||||
* @param kickMemberRequestDTO 踢会员请求dto
|
||||
* @return {@link Boolean }
|
||||
*/
|
||||
@Override
|
||||
public Boolean kickMember(KickMemberRequestDTO kickMemberRequestDTO) {
|
||||
|
||||
KickUserRequest request = new KickUserRequest();
|
||||
request.setUserName(kickMemberRequestDTO.getAccount());
|
||||
request.setMerchantCode(kickMemberRequestDTO.getAgentId());
|
||||
request.buildSignature(kickMemberRequestDTO.getAgentKey());
|
||||
KickUserResponse kickUserResponse = dbSportsClient.kickUser(request, IdUtils.fastUUID());
|
||||
if (this.isSuccess(kickUserResponse.getCode())) {
|
||||
return Boolean.TRUE;
|
||||
}
|
||||
return Boolean.FALSE;
|
||||
}
|
||||
|
||||
/**
|
||||
* 踢成员全部
|
||||
*
|
||||
* @param kickMemberAllDTO 踢成员全部dto
|
||||
* @return {@link Boolean }
|
||||
*/
|
||||
@Override
|
||||
public Boolean kickMemberAll(KickMemberAllDTO kickMemberAllDTO) {
|
||||
throw new ApiException(ErrorCode.PLATFORM_NOT_METHODS.getCode());
|
||||
}
|
||||
|
||||
/**
|
||||
* 免费游戏玩家使用的纪录
|
||||
*
|
||||
* @param getFreeSpinDashflowRequestDTO 获取自由旋转dashflow请求dto
|
||||
* @return {@link List }<{@link GameFreeRecord }>
|
||||
*/
|
||||
@Override
|
||||
public List<GameFreeRecord> getFreeSpinDashflow(GetFreeSpinDashflowRequestDTO getFreeSpinDashflowRequestDTO) {
|
||||
throw new ApiException(ErrorCode.PLATFORM_NOT_METHODS.getCode());
|
||||
}
|
||||
|
||||
/**
|
||||
* 取消赠送免费局数
|
||||
*
|
||||
* @param cancelFreeSpinRequestDTO 取消免费旋转请求
|
||||
* @return {@link Boolean }
|
||||
*/
|
||||
@Override
|
||||
public Boolean cancelFreeSpin(CancelFreeSpinRequestDTO cancelFreeSpinRequestDTO) {
|
||||
throw new ApiException(ErrorCode.PLATFORM_NOT_METHODS.getCode());
|
||||
}
|
||||
|
||||
/**
|
||||
* 游戏演示登录
|
||||
*
|
||||
* @param gameDemoLoginRequestDTO 游戏演示登录请求dto
|
||||
* @return {@link GameDemoLoginResponseDTO }
|
||||
*/
|
||||
@Override
|
||||
public GameDemoLoginResponseDTO gameDemoLogin(GameDemoLoginRequestDTO gameDemoLoginRequestDTO) {
|
||||
throw new ApiException(ErrorCode.PLATFORM_NOT_METHODS.getCode());
|
||||
}
|
||||
|
||||
/**
|
||||
* 批量插入
|
||||
*
|
||||
* @param settledOrderList 投注记录
|
||||
*/
|
||||
private void batchInsert(List<GetBetListResponse.OrderItemDTO> settledOrderList, BetRecordByTimeDTO betRecordByTimeDTO) {
|
||||
List<GameBettingDetails> gameBettingDetails = new ArrayList<>();
|
||||
List<String> wagersIds = new ArrayList<>();
|
||||
//数据组装
|
||||
List<GetBetListResponse.OrderItemDTO> dataList = settledOrderList;
|
||||
if (CollectionUtils.isEmpty(dataList)) {
|
||||
return;
|
||||
}
|
||||
|
||||
//数据转化
|
||||
for (GetBetListResponse.OrderItemDTO dataBean : dataList) {
|
||||
if (dataBean.getOrderStatus() != 1) { // 只关心结算的
|
||||
continue;
|
||||
}
|
||||
GameBettingDetails bettingDetails = this.dataBuild(GamesDataBuildDTO.builder()
|
||||
.platform(betRecordByTimeDTO.getVendor())
|
||||
.data(dataBean).build());
|
||||
if (!ObjectUtils.isEmpty(bettingDetails)) {
|
||||
bettingDetails.setId(IdUtil.getSnowflakeNextId());
|
||||
gameBettingDetails.add(bettingDetails);
|
||||
}
|
||||
wagersIds.add(dataBean.getOrderNo());
|
||||
}
|
||||
if (CollectionUtils.isEmpty(gameBettingDetails)) {
|
||||
return;
|
||||
}
|
||||
//查询重复数据id
|
||||
List<String> removeWagersIds = gameBettingDetailsService
|
||||
.selectGameBettingDetailsByWagersId(wagersIds, GamePlatforms.DBSports.getCode());
|
||||
//用steam流清除list中与wagersIds集合相同的数据
|
||||
gameBettingDetails = gameBettingDetails.stream()
|
||||
.filter(detail -> !removeWagersIds.contains(detail.getWagersId()))
|
||||
.collect(Collectors.toList());
|
||||
if (!CollectionUtils.isEmpty(gameBettingDetails)) {
|
||||
gameBettingDetailsService.batchInsert(gameBettingDetails);
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* 数据构建
|
||||
*
|
||||
* @param gamesDataBuildDTO 数据
|
||||
* @return {@link GameBettingDetails }
|
||||
*/
|
||||
@Override
|
||||
public GameBettingDetails dataBuild(GamesDataBuildDTO gamesDataBuildDTO) {
|
||||
|
||||
//转化类
|
||||
GetBetListResponse.OrderItemDTO dataBean = (GetBetListResponse.OrderItemDTO) gamesDataBuildDTO.getData();
|
||||
Member member = memberService.selectMemberByGameAccount(dataBean.getUserName());
|
||||
if (ObjectUtils.isEmpty(member)) {
|
||||
return null;
|
||||
}
|
||||
//List<Game> gameList = redisCache.getCacheList(CacheConstants.DB_Sports);
|
||||
//Game game = gameList.get(0);
|
||||
BigDecimal originPayoffAmount = BigDecimal.valueOf(dataBean.getSettleAmount());
|
||||
BigDecimal betAmount = new BigDecimal(dataBean.getOrderAmount());
|
||||
|
||||
int compareResult = originPayoffAmount.compareTo(betAmount);
|
||||
long payoffTime = dataBean.getSettleTime();
|
||||
long createTime = dataBean.getCreateTime();
|
||||
Platform platform = gamesDataBuildDTO.getPlatform();
|
||||
String systemCurrency = platform.getOurCurrency(dataBean.getCurrency());
|
||||
//数据构造
|
||||
GameBettingDetails gameBettingDetails = GameBettingDetails.builder()
|
||||
.tenantKey(member.getTenantKey())
|
||||
//保存我们的币种id
|
||||
.currencyCode(systemCurrency)
|
||||
.memberId(member.getId())
|
||||
.gameCode("1")
|
||||
.gameType(PlatformType.SPORTS.getCode()) // 体育
|
||||
.platformCode(GamePlatforms.DBSports.getCode())
|
||||
.gameId(GamePlatforms.DBSports.getCode() + "_1")
|
||||
.gameName(GamePlatforms.DBSports.getInfo())
|
||||
.gameStatus(compareResult > 0 ? GameStatus.WIN.getCode() : compareResult < 0 ? GameStatus.FAIL.getCode() : GameStatus.FLAT.getCode())
|
||||
.gameStatusType(1) // 一般下注
|
||||
.gameCurrencyCode(dataBean.getCurrency())
|
||||
.account(dataBean.getUserName())
|
||||
.wagersId(dataBean.getOrderNo())
|
||||
.wagersTime(createTime)
|
||||
.betAmount(betAmount)
|
||||
.payoffTime(payoffTime)
|
||||
.payoffAmount(originPayoffAmount.abs())
|
||||
.settlementTime(payoffTime)
|
||||
.turnover(betAmount)
|
||||
.orderNo(dataBean.getOrderNo())
|
||||
.settlementStatus(SettlementStatusEnum.COMPLETED.getCode())
|
||||
.build();
|
||||
gameBettingDetails.setCreateBy(Constants.SYSTEM);
|
||||
gameBettingDetails.setCreateTime(DateUtils.getNowDate());
|
||||
return gameBettingDetails;
|
||||
}
|
||||
}
|
||||
|
|
@ -55,6 +55,16 @@ public interface DGClient {
|
|||
@Post(url = "/v2/api/transfer")
|
||||
DGTransactionResponseDTO exchangeTransferByAgentId(@JSONBody Map<String, Object> params, @Header Map<String, Object> header);
|
||||
|
||||
|
||||
/**
|
||||
* 汇兑转移状态
|
||||
*
|
||||
* @param params 参数
|
||||
* @param header 头球
|
||||
* @return {@link DGTransactionResponseDTO }
|
||||
*/
|
||||
@Post(url = "/v2/api/checkTransfer")
|
||||
DGTransactionResponseDTO exchangeTransferStatus(@JSONBody Map<String, Object> params, @Header Map<String, Object> header);
|
||||
/**
|
||||
* 按时间获取投注记录
|
||||
*
|
||||
|
|
|
|||
|
|
@ -8,11 +8,13 @@ import com.ff.base.enums.*;
|
|||
import com.ff.base.exception.base.ApiException;
|
||||
import com.ff.base.exception.base.BaseException;
|
||||
import com.ff.base.utils.DateUtils;
|
||||
import com.ff.base.utils.SleepUtil;
|
||||
import com.ff.base.utils.StringUtils;
|
||||
import com.ff.base.utils.sign.Md5Utils;
|
||||
import com.ff.base.utils.uuid.IdUtils;
|
||||
import com.ff.config.KeyConfig;
|
||||
import com.ff.game.api.IGamesService;
|
||||
import com.ff.game.api.ae.dto.AEExchangeTransferStatusResponse;
|
||||
import com.ff.game.api.dg.client.DGClient;
|
||||
import com.ff.game.api.dg.dto.*;
|
||||
import com.ff.game.api.request.*;
|
||||
|
|
@ -69,15 +71,6 @@ public class GamesDGServiceImpl implements IGamesService {
|
|||
*/
|
||||
private static final Long GAME_ID = 1904452832756003817L;
|
||||
|
||||
/**
|
||||
* 平台ID
|
||||
*/
|
||||
private static final Long PLATFORM_ID = 1904411420157108325L;
|
||||
|
||||
/**
|
||||
* 游戏名称id
|
||||
*/
|
||||
private static final Long GAME_NAME_ID = 1904452832756002317L;
|
||||
|
||||
/**
|
||||
* 获得就是成功
|
||||
|
|
@ -195,25 +188,13 @@ public class GamesDGServiceImpl implements IGamesService {
|
|||
@Transactional
|
||||
@Override
|
||||
public String getGameList(GamesBaseRequestDTO gamesBaseRequestDTO) {
|
||||
//GamePlatform gamePlatform = gamePlatformService.selectGamePlatformById(PLATFORM_ID);
|
||||
//没有此平台就新增一个平台
|
||||
/*if (ObjectUtils.isEmpty(gamePlatform)) {
|
||||
gamePlatform = new GamePlatform();
|
||||
gamePlatform.setId(PLATFORM_ID);
|
||||
gamePlatform.setPlatformCode(GamePlatforms.DG.getInfo());
|
||||
gamePlatform.setPlatformType(PlatformType.CARD_GAME.getCode());
|
||||
gamePlatform.setPlatformName(GamePlatforms.DG.getInfo() + PlatformType.CARD_GAME.getName());
|
||||
gamePlatform.setSortNo(gamePlatformService.selectMaxSortNo() + 1);
|
||||
gamePlatform.setCreateBy(Constants.SYSTEM);
|
||||
gamePlatformService.insertGamePlatform(gamePlatform);
|
||||
}*/
|
||||
|
||||
Game game = gameService.selectGameById(GAME_ID);
|
||||
//不存在这个游戏
|
||||
if (ObjectUtils.isEmpty(game)) {
|
||||
game = new Game();
|
||||
game.setId(GAME_ID);
|
||||
game.setSortNo(1);
|
||||
//game.setPlatformId(gamePlatform.getId());
|
||||
game.setPlatformCode(GamePlatforms.DG.getCode());
|
||||
game.setPlatformType(PlatformType.GAME_HALL.getCode());
|
||||
game.setGameCode("1");
|
||||
|
|
@ -221,21 +202,30 @@ public class GamesDGServiceImpl implements IGamesService {
|
|||
game.setGameName("真人棋牌");
|
||||
game.setCreateBy(Constants.SYSTEM);
|
||||
game.setNameInfo(Collections.singletonList(new NameInfo("真人棋牌", "zh-CN")));
|
||||
game.setGameId(StringUtils.addSuffix(GamePlatforms.DG.getCode(), 1));
|
||||
gameService.insertGame(game);
|
||||
}else {
|
||||
game.setNameInfo(Collections.singletonList(new NameInfo("真人棋牌", "zh-CN")));
|
||||
gameService.updateGame(game);
|
||||
}
|
||||
/*GameName gameName = gameNameService.selectGameNameById(GAME_NAME_ID);
|
||||
if (ObjectUtils.isEmpty(gameName)) {
|
||||
gameNameService.insertGameName(GameName.builder()
|
||||
.id(GAME_NAME_ID)
|
||||
.gameId(game.getId())
|
||||
.gameName(game.getGameName())
|
||||
.langCode("zh-CN")
|
||||
.createBy(Constants.SYSTEM)
|
||||
.build());
|
||||
}*/
|
||||
return CacheConstants.DG_GAMES;
|
||||
}
|
||||
|
||||
|
||||
|
||||
/**
|
||||
* 获取交易id
|
||||
*
|
||||
* @param transactionIdRequestDTO 事务id请求dto
|
||||
* @return {@link String }
|
||||
*/
|
||||
@Override
|
||||
public String getTransactionId(TransactionIdRequestDTO transactionIdRequestDTO) {
|
||||
return GamePlatforms.DG.getInfo() + IdUtils.simpleUUID();
|
||||
}
|
||||
|
||||
|
||||
|
||||
/**
|
||||
* 按代理id进行交换转账
|
||||
*
|
||||
|
|
@ -246,41 +236,16 @@ public class GamesDGServiceImpl implements IGamesService {
|
|||
@Transactional
|
||||
public Long exchangeTransferByAgentId(ExchangeTransferMoneyRequestDTO exchangeTransferMoneyRequestDTO) {
|
||||
log.info("GamesDGServiceImpl [exchangeTransferByAgentId] 请求参数 {}", exchangeTransferMoneyRequestDTO);
|
||||
// GameSecretKeyCurrency currencyDTO = gameSecretKeyCurrencyService.findByGameSecretKeyCurrencyDTO(GameSecretKeyCurrencyDTO.builder()
|
||||
// .platformCode(GamePlatforms.DG.getInfo())
|
||||
// .code(exchangeTransferMoneyRequestDTO.getAgentId())
|
||||
// .build());
|
||||
|
||||
Member member = memberService.selectMemberByGameAccount(exchangeTransferMoneyRequestDTO.getAccount());
|
||||
String transactionId = GamePlatforms.DG.getInfo() + IdUtils.simpleUUID();
|
||||
List<GameExchangeMoney> gameExchangeMonies = gameExchangeMoneyService.selectGameExchangeMoneyList(
|
||||
GameExchangeMoney.builder()
|
||||
.tenantKey(exchangeTransferMoneyRequestDTO.getTenantKey())
|
||||
.orderId(exchangeTransferMoneyRequestDTO.getOrderId())
|
||||
.build()
|
||||
);
|
||||
Assert.isTrue(CollectionUtils.isEmpty(gameExchangeMonies), "订单号重复");
|
||||
|
||||
//获取下一个自增id
|
||||
GameExchangeMoney exchangeMoney = GameExchangeMoney
|
||||
.builder()
|
||||
.tenantKey(exchangeTransferMoneyRequestDTO.getTenantKey())
|
||||
.orderId(exchangeTransferMoneyRequestDTO.getOrderId())
|
||||
.quota(exchangeTransferMoneyRequestDTO.getQuota())
|
||||
.balance(exchangeTransferMoneyRequestDTO.getAmount())
|
||||
.exchangeType(exchangeTransferMoneyRequestDTO.getTransferType())
|
||||
.currencyCode(exchangeTransferMoneyRequestDTO.getSystemCurrency())
|
||||
.memberId(member.getId())
|
||||
.transactionId(transactionId)
|
||||
.platformCode(GamePlatforms.DG.getInfo())
|
||||
.build();
|
||||
exchangeMoney.setCreateBy(Constants.SYSTEM);
|
||||
GameExchangeMoney exchangeMoney = gameExchangeMoneyService.selectGameExchangeMoneyById(exchangeTransferMoneyRequestDTO.getGameExchangeId());
|
||||
|
||||
|
||||
BigDecimal amount = exchangeTransferMoneyRequestDTO.getAmount();
|
||||
if (TransferType.ALL.getCode().equals(exchangeTransferMoneyRequestDTO.getTransferType())) {
|
||||
// 获取第三方钱包余额
|
||||
MemberInfoRequestDTO gamesBaseRequestDTO = MemberInfoRequestDTO.builder()
|
||||
.accounts(member.getGameAccount())
|
||||
.accounts(exchangeTransferMoneyRequestDTO.getAccount())
|
||||
.agentId(exchangeTransferMoneyRequestDTO.getAgentId())
|
||||
.currency(exchangeTransferMoneyRequestDTO.getCurrency())
|
||||
.agentKey(exchangeTransferMoneyRequestDTO.getAgentKey())
|
||||
|
|
@ -293,7 +258,7 @@ public class GamesDGServiceImpl implements IGamesService {
|
|||
Map<String, Object> params = new LinkedHashMap<>();
|
||||
params.put("username", exchangeTransferMoneyRequestDTO.getAccount());
|
||||
params.put("amount", amount);
|
||||
params.put("serial", transactionId);
|
||||
params.put("serial", exchangeTransferMoneyRequestDTO.getTransactionId());
|
||||
|
||||
Map<String, Object> headerMap = this.getKey(exchangeTransferMoneyRequestDTO);
|
||||
DGTransactionResponseDTO dgTransactionResponseDTO = DGClient.exchangeTransferByAgentId(params, headerMap);
|
||||
|
|
@ -306,9 +271,13 @@ public class GamesDGServiceImpl implements IGamesService {
|
|||
exchangeMoney.setCoinAfter(dgTransactionResponseDTO.getBalance());
|
||||
exchangeMoney.setCurrencyBefore(exchangeMoney.getCoinBefore());
|
||||
exchangeMoney.setCurrencyAfter(exchangeMoney.getCoinAfter());
|
||||
exchangeMoney.setStatus(StatusType.SUCCESS.getValue());
|
||||
gameExchangeMoneyService.insertGameExchangeMoney(exchangeMoney);
|
||||
exchangeMoney.setStep(GameExchangeStep.PLATFORM_TRANSACTION.getCode());
|
||||
exchangeMoney.setStepStatus(GameExchangeStepStatus.SUCCESS.getCode());
|
||||
gameExchangeMoneyService.updateGameExchangeMoney(exchangeMoney);
|
||||
} else {
|
||||
exchangeMoney.setStep(GameExchangeStep.PLATFORM_TRANSACTION.getCode());
|
||||
exchangeMoney.setStepStatus(GameExchangeStepStatus.FAILURE.getCode());
|
||||
gameExchangeMoneyService.updateGameExchangeMoney(exchangeMoney);
|
||||
log.error("GamesDGServiceImpl [exchangeTransferByAgentId] 金额转移失败,错误代码{},错误信息{}", dgTransactionResponseDTO.getCodeId(), dgTransactionResponseDTO.getMsg());
|
||||
throw new ApiException(ErrorCode.BALANCE_TRANSFER_FAILED.getCode());
|
||||
}
|
||||
|
|
@ -320,11 +289,31 @@ public class GamesDGServiceImpl implements IGamesService {
|
|||
* 汇兑转移状态
|
||||
*
|
||||
* @param exchangeTransferMoneyRequestDTO 兑换转账请求dto
|
||||
* @return {@link Boolean }
|
||||
* @return {@link ExchangeTransferStatusResponseDTO }
|
||||
*/
|
||||
@Override
|
||||
public Boolean exchangeTransferStatus(ExchangeTransferStatusRequestDTO exchangeTransferMoneyRequestDTO) {
|
||||
return Boolean.TRUE;
|
||||
public ExchangeTransferStatusResponseDTO exchangeTransferStatus(ExchangeTransferStatusRequestDTO exchangeTransferMoneyRequestDTO) {
|
||||
log.info("GamesDGServiceImpl [exchangeTransferStatus] 请求参数 {}", exchangeTransferMoneyRequestDTO);
|
||||
|
||||
Map<String, Object> params = new LinkedHashMap<>();
|
||||
params.put("serial", exchangeTransferMoneyRequestDTO.getOrderId());
|
||||
|
||||
Map<String, Object> headerMap = this.getKey(exchangeTransferMoneyRequestDTO);
|
||||
|
||||
DGTransactionResponseDTO dgTransactionResponseDTO = DGClient.exchangeTransferStatus(params, headerMap);
|
||||
Integer status = StatusType.IN_PROGRESS.getValue();
|
||||
if (this.getIsSuccess(dgTransactionResponseDTO.getCodeId())) {
|
||||
status = StatusType.SUCCESS.getValue();
|
||||
} else {
|
||||
status = StatusType.FAILURE.getValue();
|
||||
}
|
||||
|
||||
return ExchangeTransferStatusResponseDTO.builder()
|
||||
.statusType(status)
|
||||
.balance(dgTransactionResponseDTO.getAmount().abs())
|
||||
.coinBefore(NumberUtil.sub(dgTransactionResponseDTO.getBalance(), dgTransactionResponseDTO.getAmount().abs()).abs())
|
||||
.coinAfter(dgTransactionResponseDTO.getBalance())
|
||||
.build();
|
||||
}
|
||||
|
||||
|
||||
|
|
@ -336,6 +325,7 @@ public class GamesDGServiceImpl implements IGamesService {
|
|||
*/
|
||||
@Override
|
||||
public Boolean getBetRecordByTime(BetRecordByTimeDTO betRecordByTimeDTO) {
|
||||
SleepUtil.sleep(50000);
|
||||
//请求参数
|
||||
log.info("GamesDGServiceImpl [getBetRecordByTime] 请求参数 {}", betRecordByTimeDTO);
|
||||
Map<String, Object> key = this.getKey(betRecordByTimeDTO);
|
||||
|
|
@ -360,7 +350,7 @@ public class GamesDGServiceImpl implements IGamesService {
|
|||
*/
|
||||
@Override
|
||||
public Boolean getBetRecordByHistoryTime(BetRecordByTimeDTO betRecordByTimeDTO) {
|
||||
return null;
|
||||
return Boolean.FALSE;
|
||||
}
|
||||
|
||||
/**
|
||||
|
|
@ -581,7 +571,8 @@ public class GamesDGServiceImpl implements IGamesService {
|
|||
.gameCode(String.valueOf(resultBean.getGameId()))
|
||||
.gameType(PlatformType.CARD_GAME.getCode())
|
||||
.platformCode(GamePlatforms.DG.getCode())
|
||||
.gameId(GAME_ID)
|
||||
//.gameId(GAME_ID)
|
||||
.gameId(game.getGameId())
|
||||
.gameName(game.getGameName())
|
||||
.gameStatus(gameStatus)
|
||||
.gameStatusType(resultBean.getGameType())
|
||||
|
|
|
|||
|
|
@ -0,0 +1,118 @@
|
|||
package com.ff.game.api.exchange;
|
||||
|
||||
import com.ff.base.enums.GameExchangeStep;
|
||||
import com.ff.base.enums.GameExchangeStepStatus;
|
||||
import com.ff.base.exception.base.BaseException;
|
||||
import com.ff.game.api.exchange.dto.GameExchangeDTO;
|
||||
import com.ff.game.domain.GameExchangeMoney;
|
||||
import com.ff.game.service.IGameExchangeMoneyService;
|
||||
import lombok.extern.slf4j.Slf4j;
|
||||
import org.springframework.transaction.TransactionDefinition;
|
||||
import org.springframework.transaction.support.TransactionTemplate;
|
||||
|
||||
import javax.annotation.Resource;
|
||||
|
||||
/**
|
||||
* 抽象步进处理机
|
||||
*
|
||||
* @author shi
|
||||
* @date 2025/04/09
|
||||
*/
|
||||
@Slf4j
|
||||
public abstract class AbstractStepProcessor implements StepProcessorService {
|
||||
|
||||
|
||||
@Resource
|
||||
private StepProcessorFactory stepProcessorFactory;
|
||||
|
||||
|
||||
@Resource
|
||||
private IGameExchangeMoneyService gameExchangeMoneyService;
|
||||
|
||||
/**
|
||||
* 过程
|
||||
*
|
||||
* @param gameExchangeMoney 游戏兑换货币
|
||||
*/
|
||||
@Override
|
||||
public void process(GameExchangeDTO gameExchangeMoney) {
|
||||
boolean processResult = false;
|
||||
try {
|
||||
processResult = doProcess(gameExchangeMoney);
|
||||
} catch (Exception e) {
|
||||
log.error("游戏余额转移{}-步骤任务{}-执行异常", gameExchangeMoney.getId(), stepKey().getDescription(), e);
|
||||
throw new BaseException("游戏余额转移"+gameExchangeMoney.getId()+"-步骤任务"+stepKey().getDescription()+"-执行异常" );
|
||||
}
|
||||
//更新状态
|
||||
if (processResult) {
|
||||
log.info("游戏余额转移{}-步骤任务{}-执行成功", gameExchangeMoney.getId(), stepKey().getDescription());
|
||||
triggerNextStep(gameExchangeMoney);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
|
||||
/**
|
||||
* 降低
|
||||
*
|
||||
* @param gameExchangeMoney 游戏兑换货币
|
||||
*/
|
||||
@Override
|
||||
public void rollBack(GameExchangeDTO gameExchangeMoney){
|
||||
boolean processResult = false;
|
||||
try {
|
||||
processResult = doRollBack(gameExchangeMoney);
|
||||
} catch (Exception e) {
|
||||
log.error("游戏余额转移{}-步骤任务{}-回滚异常", gameExchangeMoney.getId(), stepKey().getDescription(), e);
|
||||
}
|
||||
if (processResult) {
|
||||
log.info("游戏余额转移{}-步骤任务{}-回滚成功", gameExchangeMoney.getId(), stepKey().getDescription());
|
||||
triggerBackStep(gameExchangeMoney);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* 触发后退
|
||||
*
|
||||
* @param exchangeMoney 兑换货币
|
||||
*/
|
||||
private void triggerBackStep(GameExchangeDTO exchangeMoney) {
|
||||
GameExchangeStep nextStep = backStepProcessor();
|
||||
if (nextStep != null) {
|
||||
stepProcessorFactory.getStepProcessor(nextStep).rollBack(exchangeMoney);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
|
||||
/**
|
||||
* 触发下一步
|
||||
*
|
||||
* @param exchangeMoney 兑换货币
|
||||
*/
|
||||
private void triggerNextStep(GameExchangeDTO exchangeMoney) {
|
||||
GameExchangeStep nextStep = nextStepProcessor();
|
||||
if (nextStep != null) {
|
||||
stepProcessorFactory.getStepProcessor(nextStep).process(exchangeMoney);
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* 一定要回滚
|
||||
*
|
||||
* @param gameExchangeMoney 游戏兑换货币
|
||||
* @return boolean
|
||||
* @throws Exception 例外
|
||||
*/
|
||||
abstract public boolean doRollBack(GameExchangeDTO gameExchangeMoney) throws Exception;
|
||||
|
||||
/**
|
||||
* do过程
|
||||
*
|
||||
* @param gameExchangeMoney 游戏兑换货币
|
||||
* @return boolean
|
||||
* @throws Exception 例外
|
||||
*/
|
||||
abstract public boolean doProcess(GameExchangeDTO gameExchangeMoney) throws Exception;
|
||||
}
|
||||
|
|
@ -0,0 +1,47 @@
|
|||
package com.ff.game.api.exchange;
|
||||
|
||||
import com.ff.base.enums.GameExchangeStep;
|
||||
import org.springframework.beans.factory.annotation.Autowired;
|
||||
import org.springframework.stereotype.Component;
|
||||
|
||||
import javax.annotation.PostConstruct;
|
||||
import java.util.Collections;
|
||||
import java.util.HashMap;
|
||||
import java.util.List;
|
||||
import java.util.Map;
|
||||
|
||||
/**
|
||||
* 步进处理机厂
|
||||
*
|
||||
* @author shi
|
||||
* @date 2025/04/09
|
||||
*/
|
||||
@Component
|
||||
public class StepProcessorFactory {
|
||||
|
||||
@Autowired
|
||||
List<StepProcessorService> stepProcessors;
|
||||
|
||||
private Map<GameExchangeStep, StepProcessorService> processorMap;
|
||||
|
||||
@PostConstruct
|
||||
public void init() {
|
||||
Map<GameExchangeStep, StepProcessorService> map = new HashMap<>();
|
||||
for (StepProcessorService stepProcessor : stepProcessors) {
|
||||
map.put(stepProcessor.stepKey(), stepProcessor);
|
||||
}
|
||||
|
||||
processorMap = Collections.unmodifiableMap(map);
|
||||
}
|
||||
|
||||
/**
|
||||
* 获取步进处理器
|
||||
*
|
||||
* @param stepKey 步进键
|
||||
* @return {@link StepProcessorService }
|
||||
*/
|
||||
public StepProcessorService getStepProcessor(GameExchangeStep stepKey) {
|
||||
return processorMap.get(stepKey);
|
||||
}
|
||||
|
||||
}
|
||||
|
|
@ -0,0 +1,56 @@
|
|||
package com.ff.game.api.exchange;
|
||||
|
||||
import com.ff.base.enums.GameExchangeStep;
|
||||
import com.ff.game.api.exchange.dto.GameExchangeDTO;
|
||||
|
||||
/**
|
||||
* 步进处理机
|
||||
*
|
||||
* @author shi
|
||||
* @date 2025/04/09
|
||||
*/
|
||||
public interface StepProcessorService {
|
||||
|
||||
/**
|
||||
* 返回处理器类型
|
||||
*
|
||||
* @return {@link GameExchangeStep }
|
||||
*/
|
||||
GameExchangeStep stepKey();
|
||||
|
||||
|
||||
/**
|
||||
* 过程
|
||||
*
|
||||
* @param gameExchangeMoney 游戏兑换货币
|
||||
*/
|
||||
void process(GameExchangeDTO gameExchangeMoney);
|
||||
|
||||
|
||||
/**
|
||||
* 回退
|
||||
*
|
||||
* @param gameExchangeMoney 游戏兑换货币
|
||||
*/
|
||||
void rollBack(GameExchangeDTO gameExchangeMoney);
|
||||
|
||||
|
||||
/**
|
||||
* 步骤之间有依赖
|
||||
* 找出下一个步骤处理器进行处理
|
||||
*
|
||||
* @return
|
||||
*/
|
||||
GameExchangeStep nextStepProcessor();
|
||||
|
||||
|
||||
/**
|
||||
* 步骤之间有依赖
|
||||
* 找出上一个步骤处理器进行处理
|
||||
*
|
||||
* @return {@link GameExchangeStep }
|
||||
*/
|
||||
GameExchangeStep backStepProcessor();
|
||||
|
||||
|
||||
}
|
||||
|
|
@ -0,0 +1,32 @@
|
|||
package com.ff.game.api.exchange.dto;
|
||||
|
||||
import com.ff.base.annotation.Excel;
|
||||
import com.ff.game.domain.GameExchangeMoney;
|
||||
import lombok.AllArgsConstructor;
|
||||
import lombok.Data;
|
||||
import lombok.NoArgsConstructor;
|
||||
import lombok.experimental.SuperBuilder;
|
||||
|
||||
/**
|
||||
* 游戏兑换货币dto
|
||||
*
|
||||
* @author shi
|
||||
* @date 2025/04/09
|
||||
*/
|
||||
@Data
|
||||
@AllArgsConstructor
|
||||
@NoArgsConstructor
|
||||
@SuperBuilder
|
||||
public class GameExchangeDTO extends GameExchangeMoney {
|
||||
/**
|
||||
* 触发类型 1 用户调用手动触发 2 定时器触发
|
||||
*/
|
||||
private Integer triggerType;
|
||||
|
||||
/** 会员账号 */
|
||||
private String memberAccount;
|
||||
|
||||
/** 游戏账号 */
|
||||
private String gameAccount;
|
||||
|
||||
}
|
||||
|
|
@ -0,0 +1,170 @@
|
|||
package com.ff.game.api.exchange.impl;
|
||||
|
||||
import com.ff.base.constant.Constants;
|
||||
import com.ff.base.enums.*;
|
||||
import com.ff.base.exception.base.ApiException;
|
||||
import com.ff.base.utils.StringUtils;
|
||||
import com.ff.common.domain.TenantGameQuotaFlow;
|
||||
import com.ff.common.dto.BalanceChangesDTO;
|
||||
import com.ff.common.dto.GameBalanceExchange;
|
||||
import com.ff.common.service.ITenantGameQuotaFlowService;
|
||||
import com.ff.common.service.ITenantGameQuotaService;
|
||||
import com.ff.game.api.IGamesService;
|
||||
import com.ff.game.api.exchange.AbstractStepProcessor;
|
||||
import com.ff.game.api.exchange.dto.GameExchangeDTO;
|
||||
import com.ff.game.api.request.ExchangeTransferMoneyRequestDTO;
|
||||
import com.ff.game.api.request.ExchangeTransferStatusRequestDTO;
|
||||
import com.ff.game.api.request.ExchangeTransferStatusResponseDTO;
|
||||
import com.ff.game.domain.KeyInfo;
|
||||
import com.ff.game.domain.Platform;
|
||||
import com.ff.game.service.IGameExchangeMoneyService;
|
||||
import com.ff.game.service.IPlatformService;
|
||||
import com.ff.member.domain.Member;
|
||||
import com.ff.member.service.IMemberService;
|
||||
import org.springframework.beans.factory.annotation.Autowired;
|
||||
import org.springframework.core.annotation.Order;
|
||||
import org.springframework.stereotype.Service;
|
||||
import org.springframework.transaction.PlatformTransactionManager;
|
||||
import org.springframework.transaction.TransactionDefinition;
|
||||
import org.springframework.transaction.support.TransactionTemplate;
|
||||
|
||||
import javax.annotation.Resource;
|
||||
import java.math.BigDecimal;
|
||||
import java.util.List;
|
||||
import java.util.Map;
|
||||
|
||||
|
||||
/**
|
||||
* 增加余额
|
||||
*
|
||||
* @author shi
|
||||
* @date 2025/04/09
|
||||
*/
|
||||
@Service
|
||||
@Order(4)
|
||||
public class AddBalanceServiceImpl extends AbstractStepProcessor {
|
||||
|
||||
|
||||
@Resource
|
||||
private IMemberService memberService;
|
||||
|
||||
@Resource
|
||||
private ITenantGameQuotaService tenantGameQuotaService;
|
||||
@Resource
|
||||
private IGameExchangeMoneyService gameExchangeMoneyService;
|
||||
@Resource
|
||||
private PlatformTransactionManager transactionManager;
|
||||
@Resource
|
||||
private IPlatformService platformService;
|
||||
/**
|
||||
* 步进键
|
||||
*
|
||||
* @return {@link GameExchangeStep }
|
||||
*/
|
||||
@Override
|
||||
public GameExchangeStep stepKey() {
|
||||
return GameExchangeStep.TENANT_QUOTA_DEDUCTED;
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* do过程
|
||||
*
|
||||
* @param gameExchangeMoney 游戏兑换货币
|
||||
* @return boolean
|
||||
*/
|
||||
@Override
|
||||
public boolean doProcess(GameExchangeDTO gameExchangeMoney) {
|
||||
//如果不是之前的步骤代码执行过了 或者是转入操作
|
||||
if (!gameExchangeMoney.getStep().equals(GameExchangeStep.PLATFORM_TRANSACTION.getCode()) ) {
|
||||
return Boolean.TRUE;
|
||||
}
|
||||
if (!gameExchangeMoney.getStepStatus().equals(StatusType.SUCCESS.getValue())){
|
||||
return Boolean.TRUE;
|
||||
}
|
||||
|
||||
TransactionTemplate transactionTemplate = new TransactionTemplate(transactionManager);
|
||||
transactionTemplate.setPropagationBehavior(TransactionDefinition.PROPAGATION_REQUIRES_NEW);
|
||||
Boolean result = transactionTemplate.execute(transactionStatus -> {
|
||||
//不是转入操作
|
||||
if (!TransferType.ALL.getCode().equals(gameExchangeMoney.getExchangeType())) {
|
||||
gameExchangeMoney.setStep(GameExchangeStep.DEDUCT_BALANCE.getCode());
|
||||
gameExchangeMoney.setStepStatus(GameExchangeStepStatus.SUCCESS.getCode());
|
||||
gameExchangeMoney.setStatus(StatusType.SUCCESS.getValue());
|
||||
return gameExchangeMoneyService.updateGameExchangeMoney(gameExchangeMoney) > 0;
|
||||
}
|
||||
|
||||
Platform platform = platformService.get(gameExchangeMoney.getPlatformCode());
|
||||
KeyInfo keyInfo = null;
|
||||
for (KeyInfo keyData : platform.getKeyInfo()) {
|
||||
if (StringUtils.isNotEmpty(gameExchangeMoney.getCurrencyCode())) {
|
||||
if (keyData.getCurrency().equalsIgnoreCase(gameExchangeMoney.getCurrencyCode())) {
|
||||
keyInfo = keyData;
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
BigDecimal decimal = tenantGameQuotaService.gameBalanceExchange(GameBalanceExchange.builder()
|
||||
.platformCode(gameExchangeMoney.getPlatformCode())
|
||||
.sourceId(String.valueOf(gameExchangeMoney.getId()))
|
||||
.currencyCode(gameExchangeMoney.getCurrencyCode())
|
||||
.currency(gameExchangeMoney.getCurrencyCode())
|
||||
.transferType(gameExchangeMoney.getExchangeType())
|
||||
.amount(gameExchangeMoney.getBalance())
|
||||
.isAll(Boolean.FALSE)
|
||||
.account(memberService.selectMemberById(gameExchangeMoney.getMemberId()).getMemberAccount())
|
||||
.tenantKey(gameExchangeMoney.getTenantKey())
|
||||
.systemCurrency(gameExchangeMoney.getCurrencyCode())
|
||||
.agentId(keyInfo.getCode())
|
||||
.agentKey(keyInfo.getKey())
|
||||
.build());
|
||||
|
||||
gameExchangeMoney.setQuota(decimal);
|
||||
gameExchangeMoney.setStep(GameExchangeStep.TENANT_QUOTA_DEDUCTED.getCode());
|
||||
gameExchangeMoney.setStepStatus(GameExchangeStepStatus.SUCCESS.getCode());
|
||||
gameExchangeMoney.setStatus(StatusType.SUCCESS.getValue());
|
||||
return gameExchangeMoneyService.updateGameExchangeMoney(gameExchangeMoney) > 0;
|
||||
|
||||
});
|
||||
return Boolean.TRUE.equals(result);
|
||||
|
||||
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* 一定要回滚 最后一步成功了就结束了
|
||||
*
|
||||
* @param gameExchangeMoney 游戏兑换货币
|
||||
* @return boolean
|
||||
*/
|
||||
@Override
|
||||
public boolean doRollBack(GameExchangeDTO gameExchangeMoney) {
|
||||
return Boolean.TRUE;
|
||||
}
|
||||
|
||||
/**
|
||||
* 下一步处理器
|
||||
*
|
||||
* @return {@link GameExchangeStep }
|
||||
*/
|
||||
@Override
|
||||
public GameExchangeStep nextStepProcessor() {
|
||||
return null;
|
||||
}
|
||||
|
||||
/**
|
||||
* 后级处理器 最后一步无法回滚
|
||||
*
|
||||
* @return {@link GameExchangeStep }
|
||||
*/
|
||||
@Override
|
||||
public GameExchangeStep backStepProcessor() {
|
||||
{
|
||||
return null;
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
|
|
@ -0,0 +1,112 @@
|
|||
package com.ff.game.api.exchange.impl;
|
||||
|
||||
import com.ff.base.constant.Constants;
|
||||
import com.ff.base.enums.*;
|
||||
import com.ff.base.exception.base.ApiException;
|
||||
import com.ff.base.manager.AsyncManager;
|
||||
import com.ff.base.utils.DateUtils;
|
||||
import com.ff.base.utils.uuid.IdUtils;
|
||||
import com.ff.game.api.IGamesService;
|
||||
import com.ff.game.api.exchange.AbstractStepProcessor;
|
||||
import com.ff.game.api.exchange.StepProcessorFactory;
|
||||
import com.ff.game.api.exchange.StepProcessorService;
|
||||
import com.ff.game.api.exchange.dto.GameExchangeDTO;
|
||||
import com.ff.game.api.request.ExchangeTransferStatusRequestDTO;
|
||||
import com.ff.game.api.request.TransactionIdRequestDTO;
|
||||
import com.ff.game.domain.GameExchangeMoney;
|
||||
import com.ff.game.service.IGameExchangeMoneyService;
|
||||
import com.ff.member.domain.Member;
|
||||
import org.springframework.beans.factory.annotation.Autowired;
|
||||
import org.springframework.core.annotation.Order;
|
||||
import org.springframework.stereotype.Service;
|
||||
|
||||
import javax.annotation.Resource;
|
||||
import javax.crypto.spec.SecretKeySpec;
|
||||
import java.util.Base64;
|
||||
import java.util.Map;
|
||||
|
||||
/**
|
||||
* 创建订单impl
|
||||
*
|
||||
* @author shi
|
||||
* @date 2025/04/09
|
||||
*/
|
||||
@Service
|
||||
@Order(1)
|
||||
public class CreateOrderServiceImpl extends AbstractStepProcessor {
|
||||
|
||||
@Resource
|
||||
private IGameExchangeMoneyService gameExchangeMoneyService;
|
||||
@Resource
|
||||
private StepProcessorFactory stepProcessorFactory;
|
||||
|
||||
@Autowired
|
||||
private Map<String, IGamesService> gamesService;
|
||||
|
||||
/**
|
||||
* 步进键
|
||||
*
|
||||
* @return {@link GameExchangeStep }
|
||||
*/
|
||||
@Override
|
||||
public GameExchangeStep stepKey() {
|
||||
return GameExchangeStep.CREATE_ORDER;
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* do过程
|
||||
*
|
||||
* @param gameExchangeMoney 游戏兑换货币
|
||||
* @return boolean
|
||||
*/
|
||||
@Override
|
||||
public boolean doProcess(GameExchangeDTO gameExchangeMoney) {
|
||||
|
||||
String transactionId = gamesService.get(gameExchangeMoney.getPlatformCode()+Constants.SERVICE).getTransactionId(TransactionIdRequestDTO.builder().exchangeType(gameExchangeMoney.getExchangeType()).gameAccount(gameExchangeMoney.getGameAccount()).build());
|
||||
gameExchangeMoney.setTransactionId(transactionId);
|
||||
gameExchangeMoney.setCreateBy(Constants.SYSTEM);
|
||||
gameExchangeMoney.setStatus(StatusType.IN_PROGRESS.getValue());
|
||||
gameExchangeMoney.setStep(GameExchangeStep.CREATE_ORDER.getCode());
|
||||
gameExchangeMoney.setStepStatus(GameExchangeStepStatus.SUCCESS.getCode());
|
||||
return gameExchangeMoneyService.insertGameExchangeMoney(gameExchangeMoney) > 0;
|
||||
}
|
||||
|
||||
|
||||
|
||||
/**
|
||||
* 一定要回滚
|
||||
*
|
||||
* @param gameExchangeMoney 游戏兑换货币
|
||||
* @return boolean
|
||||
*/
|
||||
@Override
|
||||
public boolean doRollBack(GameExchangeDTO gameExchangeMoney) {
|
||||
gameExchangeMoney.setStep(GameExchangeStep.CREATE_ORDER.getCode());
|
||||
gameExchangeMoney.setStepStatus(GameExchangeStepStatus.FAILURE.getCode());
|
||||
gameExchangeMoney.setStatus(StatusType.FAILURE.getValue());
|
||||
gameExchangeMoney.setUpdateBy(Constants.SYSTEM);
|
||||
gameExchangeMoney.setUpdateTime(DateUtils.getNowDate());
|
||||
return gameExchangeMoneyService.updateGameExchangeMoney(gameExchangeMoney) > 0;
|
||||
}
|
||||
|
||||
/**
|
||||
* 下一步处理器
|
||||
*
|
||||
* @return {@link GameExchangeStep }
|
||||
*/
|
||||
@Override
|
||||
public GameExchangeStep nextStepProcessor() {
|
||||
return GameExchangeStep.DEDUCT_BALANCE;
|
||||
}
|
||||
|
||||
/**
|
||||
* 后级处理器
|
||||
*
|
||||
* @return {@link GameExchangeStep }
|
||||
*/
|
||||
@Override
|
||||
public GameExchangeStep backStepProcessor() {
|
||||
return null;
|
||||
}
|
||||
}
|
||||
|
|
@ -0,0 +1,207 @@
|
|||
package com.ff.game.api.exchange.impl;
|
||||
|
||||
import com.ff.base.constant.Constants;
|
||||
import com.ff.base.enums.*;
|
||||
import com.ff.base.exception.base.ApiException;
|
||||
import com.ff.base.utils.DateUtils;
|
||||
import com.ff.base.utils.QuotaUtils;
|
||||
import com.ff.base.utils.StringUtils;
|
||||
import com.ff.base.utils.uuid.IdUtils;
|
||||
import com.ff.common.domain.TenantGameQuota;
|
||||
import com.ff.common.domain.TenantGameQuotaFlow;
|
||||
import com.ff.common.dto.BalanceChangesDTO;
|
||||
import com.ff.common.dto.GameBalanceExchange;
|
||||
import com.ff.common.service.ITenantGameQuotaFlowService;
|
||||
import com.ff.common.service.ITenantGameQuotaService;
|
||||
import com.ff.game.api.exchange.AbstractStepProcessor;
|
||||
import com.ff.game.api.exchange.StepProcessorFactory;
|
||||
import com.ff.game.api.exchange.dto.GameExchangeDTO;
|
||||
import com.ff.game.domain.GameExchangeMoney;
|
||||
import com.ff.game.domain.KeyInfo;
|
||||
import com.ff.game.domain.Platform;
|
||||
import com.ff.game.service.IGameExchangeMoneyService;
|
||||
import com.ff.game.service.IPlatformService;
|
||||
import com.ff.member.service.IMemberService;
|
||||
import org.springframework.beans.factory.annotation.Autowired;
|
||||
import org.springframework.core.annotation.Order;
|
||||
import org.springframework.stereotype.Service;
|
||||
import org.springframework.transaction.PlatformTransactionManager;
|
||||
import org.springframework.transaction.TransactionDefinition;
|
||||
import org.springframework.transaction.support.TransactionTemplate;
|
||||
import org.springframework.util.CollectionUtils;
|
||||
|
||||
import javax.annotation.Resource;
|
||||
import java.math.BigDecimal;
|
||||
import java.util.List;
|
||||
|
||||
|
||||
/**
|
||||
* 转入提前扣租户余额impl
|
||||
*
|
||||
* @author shi
|
||||
* @date 2025/04/09
|
||||
*/
|
||||
@Service
|
||||
@Order(2)
|
||||
public class DeductBalanceServiceImpl extends AbstractStepProcessor {
|
||||
|
||||
@Resource
|
||||
private IGameExchangeMoneyService gameExchangeMoneyService;
|
||||
|
||||
@Resource
|
||||
private ITenantGameQuotaService tenantGameQuotaService;
|
||||
|
||||
@Resource
|
||||
private IMemberService memberService;
|
||||
|
||||
@Resource
|
||||
private IPlatformService platformService;
|
||||
@Resource
|
||||
private ITenantGameQuotaFlowService tenantGameQuotaFlowService;
|
||||
@Autowired
|
||||
private PlatformTransactionManager transactionManager;
|
||||
|
||||
/**
|
||||
* 步进键
|
||||
*
|
||||
* @return {@link GameExchangeStep }
|
||||
*/
|
||||
@Override
|
||||
public GameExchangeStep stepKey() {
|
||||
return GameExchangeStep.DEDUCT_BALANCE;
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* do过程
|
||||
*
|
||||
* @param gameExchangeMoney 游戏兑换货币
|
||||
* @return boolean
|
||||
*/
|
||||
@Override
|
||||
public boolean doProcess(GameExchangeDTO gameExchangeMoney) {
|
||||
TransactionTemplate transactionTemplate = new TransactionTemplate(transactionManager);
|
||||
transactionTemplate.setPropagationBehavior(TransactionDefinition.PROPAGATION_REQUIRES_NEW);
|
||||
Boolean result = transactionTemplate.execute(transactionStatus -> {
|
||||
|
||||
//如果不是之前的步骤代码执行过了
|
||||
if (!gameExchangeMoney.getStep().equals(this.backStepProcessor().getCode())) {
|
||||
return Boolean.TRUE;
|
||||
}
|
||||
//不是转入操作
|
||||
if (!TransferType.GAMES.getCode().equals(gameExchangeMoney.getExchangeType())) {
|
||||
gameExchangeMoney.setStep(GameExchangeStep.DEDUCT_BALANCE.getCode());
|
||||
gameExchangeMoney.setStepStatus(GameExchangeStepStatus.SUCCESS.getCode());
|
||||
return gameExchangeMoneyService.updateGameExchangeMoney(gameExchangeMoney) > 0;
|
||||
}
|
||||
|
||||
Platform platform = platformService.get(gameExchangeMoney.getPlatformCode());
|
||||
KeyInfo keyInfo = null;
|
||||
for (KeyInfo keyData : platform.getKeyInfo()) {
|
||||
if (StringUtils.isNotEmpty(gameExchangeMoney.getCurrencyCode())) {
|
||||
if (keyData.getCurrency().equalsIgnoreCase(gameExchangeMoney.getCurrencyCode())) {
|
||||
keyInfo = keyData;
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
BigDecimal decimal = tenantGameQuotaService.gameBalanceExchange(GameBalanceExchange.builder()
|
||||
.platformCode(gameExchangeMoney.getPlatformCode())
|
||||
.sourceId(String.valueOf(gameExchangeMoney.getId()))
|
||||
.currencyCode(gameExchangeMoney.getCurrencyCode())
|
||||
.currency(gameExchangeMoney.getCurrencyCode())
|
||||
.transferType(gameExchangeMoney.getExchangeType())
|
||||
.amount(gameExchangeMoney.getBalance())
|
||||
.account(memberService.selectMemberById(gameExchangeMoney.getMemberId()).getMemberAccount())
|
||||
.tenantKey(gameExchangeMoney.getTenantKey())
|
||||
.systemCurrency(gameExchangeMoney.getCurrencyCode())
|
||||
.agentId(keyInfo.getCode())
|
||||
.isAll(Boolean.TRUE)
|
||||
.agentKey(keyInfo.getKey())
|
||||
.build());
|
||||
|
||||
gameExchangeMoney.setQuota(decimal);
|
||||
|
||||
|
||||
gameExchangeMoney.setStep(GameExchangeStep.DEDUCT_BALANCE.getCode());
|
||||
gameExchangeMoney.setStepStatus(GameExchangeStepStatus.SUCCESS.getCode());
|
||||
return gameExchangeMoneyService.updateGameExchangeMoney(gameExchangeMoney) > 0;
|
||||
});
|
||||
return Boolean.TRUE.equals(result);
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* 一定要回滚
|
||||
*
|
||||
* @param gameExchangeMoney 游戏兑换货币
|
||||
* @return boolean
|
||||
*/
|
||||
@Override
|
||||
public boolean doRollBack(GameExchangeDTO gameExchangeMoney) {
|
||||
//如果不是之前的步骤代码执行过了 或者是转入操作
|
||||
if (!gameExchangeMoney.getStep().equals(this.stepKey().getCode())) {
|
||||
return Boolean.TRUE;
|
||||
}
|
||||
TransactionTemplate transactionTemplate = new TransactionTemplate(transactionManager);
|
||||
transactionTemplate.setPropagationBehavior(TransactionDefinition.PROPAGATION_REQUIRES_NEW);
|
||||
|
||||
//如果该订单已经回滚过增加余额
|
||||
List<TenantGameQuotaFlow> tenantGameQuotaFlows = tenantGameQuotaFlowService.selectTenantGameQuotaFlowList(
|
||||
TenantGameQuotaFlow.builder()
|
||||
.sourceId(String.valueOf(gameExchangeMoney.getId()))
|
||||
.isOut(Boolean.TRUE)
|
||||
.build());
|
||||
if (!CollectionUtils.isEmpty(tenantGameQuotaFlows)){
|
||||
return Boolean.TRUE;
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
||||
tenantGameQuotaFlows = tenantGameQuotaFlowService.selectTenantGameQuotaFlowList(
|
||||
TenantGameQuotaFlow.builder()
|
||||
.sourceId(String.valueOf(gameExchangeMoney.getId()))
|
||||
.isOut(Boolean.FALSE)
|
||||
.build());
|
||||
if (CollectionUtils.isEmpty(tenantGameQuotaFlows)) {
|
||||
return Boolean.TRUE;
|
||||
}
|
||||
//取出第一个
|
||||
TenantGameQuotaFlow tenantGameQuotaFlow = tenantGameQuotaFlows.get(0);
|
||||
return tenantGameQuotaService.balanceChanges(BalanceChangesDTO.builder()
|
||||
.isOut(Boolean.TRUE)
|
||||
.platformCode(tenantGameQuotaFlow.getPlatformCode())
|
||||
.currencyCode(tenantGameQuotaFlow.getCurrencyCode())
|
||||
.tenantKey(tenantGameQuotaFlow.getTenantKey())
|
||||
.balance(tenantGameQuotaFlow.getBalance())
|
||||
.sourceId(tenantGameQuotaFlow.getSourceId())
|
||||
.memberId(gameExchangeMoney.getMemberId())
|
||||
.operationType(OperationType.API_BALANCE.getCode())
|
||||
.remark(OperationType.API_BALANCE.getDescription())
|
||||
.quotaType(tenantGameQuotaFlow.getQuotaType()).build());
|
||||
}
|
||||
|
||||
/**
|
||||
* 下一步处理器
|
||||
*
|
||||
* @return {@link GameExchangeStep }
|
||||
*/
|
||||
@Override
|
||||
public GameExchangeStep nextStepProcessor() {
|
||||
return GameExchangeStep.PLATFORM_TRANSACTION;
|
||||
}
|
||||
|
||||
/**
|
||||
* 后级处理器
|
||||
*
|
||||
* @return {@link GameExchangeStep }
|
||||
*/
|
||||
@Override
|
||||
public GameExchangeStep backStepProcessor() {
|
||||
{
|
||||
return GameExchangeStep.CREATE_ORDER;
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
|
|
@ -0,0 +1,214 @@
|
|||
package com.ff.game.api.exchange.impl;
|
||||
|
||||
import com.ff.base.constant.Constants;
|
||||
import com.ff.base.enums.*;
|
||||
import com.ff.base.exception.base.ApiException;
|
||||
import com.ff.base.utils.StringUtils;
|
||||
import com.ff.common.domain.TenantGameQuotaFlow;
|
||||
import com.ff.common.dto.BalanceChangesDTO;
|
||||
import com.ff.common.dto.GameBalanceExchange;
|
||||
import com.ff.common.service.ITenantGameQuotaFlowService;
|
||||
import com.ff.common.service.ITenantGameQuotaService;
|
||||
import com.ff.game.api.IGamesService;
|
||||
import com.ff.game.api.exchange.AbstractStepProcessor;
|
||||
import com.ff.game.api.exchange.dto.GameExchangeDTO;
|
||||
import com.ff.game.api.request.ExchangeTransferMoneyRequestDTO;
|
||||
import com.ff.game.api.request.ExchangeTransferStatusRequestDTO;
|
||||
import com.ff.game.api.request.ExchangeTransferStatusResponseDTO;
|
||||
import com.ff.game.domain.GameExchangeMoney;
|
||||
import com.ff.game.domain.KeyInfo;
|
||||
import com.ff.game.domain.Platform;
|
||||
import com.ff.game.service.IGameExchangeMoneyService;
|
||||
import com.ff.game.service.IPlatformService;
|
||||
import com.ff.member.domain.Member;
|
||||
import com.ff.member.service.IMemberService;
|
||||
import org.springframework.beans.factory.annotation.Autowired;
|
||||
import org.springframework.core.annotation.Order;
|
||||
import org.springframework.stereotype.Service;
|
||||
|
||||
import javax.annotation.Resource;
|
||||
import java.math.BigDecimal;
|
||||
import java.util.List;
|
||||
import java.util.Map;
|
||||
|
||||
|
||||
/**
|
||||
* 操作第三方扣减
|
||||
*
|
||||
* @author shi
|
||||
* @date 2025/04/09
|
||||
*/
|
||||
@Service
|
||||
@Order(3)
|
||||
public class PlatformTransactionServiceImpl extends AbstractStepProcessor {
|
||||
|
||||
|
||||
@Resource
|
||||
private IGameExchangeMoneyService gameExchangeMoneyService;
|
||||
|
||||
@Resource
|
||||
private IMemberService memberService;
|
||||
|
||||
@Resource
|
||||
private IPlatformService platformService;
|
||||
|
||||
@Autowired
|
||||
private Map<String, IGamesService> gamesService;
|
||||
|
||||
/**
|
||||
* 步进键
|
||||
*
|
||||
* @return {@link GameExchangeStep }
|
||||
*/
|
||||
@Override
|
||||
public GameExchangeStep stepKey() {
|
||||
return GameExchangeStep.PLATFORM_TRANSACTION;
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* do过程
|
||||
*
|
||||
* @param gameExchangeMoney 游戏兑换货币
|
||||
* @return boolean
|
||||
*/
|
||||
@Override
|
||||
public boolean doProcess(GameExchangeDTO gameExchangeMoney) {
|
||||
//如果不是之前的步骤代码执行过了 或者当前步骤成功的
|
||||
if (!gameExchangeMoney.getStep().equals(this.backStepProcessor().getCode())&&
|
||||
(GameExchangeStep.PLATFORM_TRANSACTION.getCode().equals(gameExchangeMoney.getStep())&&
|
||||
gameExchangeMoney.getStepStatus().equals(GameExchangeStepStatus.SUCCESS.getCode()))
|
||||
) {
|
||||
return Boolean.TRUE;
|
||||
}
|
||||
|
||||
|
||||
Platform platform = platformService.get(gameExchangeMoney.getPlatformCode());
|
||||
|
||||
String targetCurrency = platform.getCurrencyInfo().get(gameExchangeMoney.getCurrencyCode());
|
||||
ApiException.notNull(targetCurrency, ErrorCode.CURRENCY_NOT_EXIST.getCode());
|
||||
|
||||
KeyInfo keyInfo = null;
|
||||
for (KeyInfo keyData : platform.getKeyInfo()) {
|
||||
if (StringUtils.isNotEmpty(gameExchangeMoney.getCurrencyCode())) {
|
||||
if (keyData.getCurrency().equalsIgnoreCase(gameExchangeMoney.getCurrencyCode())) {
|
||||
keyInfo = keyData;
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
Member member = memberService.selectMemberById(gameExchangeMoney.getMemberId());
|
||||
IGamesService iGamesService = gamesService.get(gameExchangeMoney.getPlatformCode() + Constants.SERVICE);
|
||||
|
||||
//查询订单详情
|
||||
if (TriggerType.TIMER.getCode() == gameExchangeMoney.getTriggerType()) {
|
||||
//做二次确认调订单详情接口
|
||||
this.doRollBack(gameExchangeMoney);
|
||||
if (GameExchangeStepStatus.FAILURE.getCode() == gameExchangeMoney.getStepStatus()){
|
||||
throw new ApiException(ErrorCode.BALANCE_TRANSFER_FAILED.getCode());
|
||||
}
|
||||
}
|
||||
|
||||
try {
|
||||
//操作第三方额度接口
|
||||
ExchangeTransferMoneyRequestDTO exchangeTransferMoneyRequestDTO = ExchangeTransferMoneyRequestDTO.builder()
|
||||
.agentId(keyInfo.getCode())
|
||||
.agentKey(keyInfo.getKey())
|
||||
.account(member.getGameAccount())
|
||||
.currency(targetCurrency)
|
||||
.amount(gameExchangeMoney.getBalance())
|
||||
.transferType(gameExchangeMoney.getExchangeType())
|
||||
.transactionId(gameExchangeMoney.getTransactionId())
|
||||
.gameExchangeId(gameExchangeMoney.getId())
|
||||
.vendor(platform)
|
||||
.keyInfo(keyInfo)
|
||||
.build();
|
||||
Long id = iGamesService.exchangeTransferByAgentId(exchangeTransferMoneyRequestDTO);
|
||||
}catch (Exception e){
|
||||
//做二次确认调订单详情接口
|
||||
this.doRollBack(gameExchangeMoney);
|
||||
if (GameExchangeStepStatus.FAILURE.getCode() == gameExchangeMoney.getStepStatus()){
|
||||
throw new ApiException(ErrorCode.BALANCE_TRANSFER_FAILED.getCode());
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
GameExchangeMoney exchangeMoney = gameExchangeMoneyService.selectGameExchangeMoneyById(gameExchangeMoney.getId());
|
||||
gameExchangeMoney.setBalance(exchangeMoney.getBalance());
|
||||
gameExchangeMoney.setStep(exchangeMoney.getStep());
|
||||
gameExchangeMoney.setStepStatus(exchangeMoney.getStepStatus());
|
||||
return gameExchangeMoneyService.updateGameExchangeMoney(gameExchangeMoney) > 0;
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* 一定要回滚
|
||||
*
|
||||
* @param gameExchangeMoney 游戏兑换货币
|
||||
* @return boolean
|
||||
*/
|
||||
@Override
|
||||
public boolean doRollBack(GameExchangeDTO gameExchangeMoney) {
|
||||
|
||||
Platform platform = platformService.get(gameExchangeMoney.getPlatformCode());
|
||||
|
||||
String targetCurrency = platform.getCurrencyInfo().get(gameExchangeMoney.getCurrencyCode());
|
||||
ApiException.notNull(targetCurrency, ErrorCode.CURRENCY_NOT_EXIST.getCode());
|
||||
|
||||
KeyInfo keyInfo = null;
|
||||
for (KeyInfo keyData : platform.getKeyInfo()) {
|
||||
if (StringUtils.isNotEmpty(gameExchangeMoney.getCurrencyCode())) {
|
||||
if (keyData.getCurrency().equalsIgnoreCase(gameExchangeMoney.getCurrencyCode())) {
|
||||
keyInfo = keyData;
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
Member member = memberService.selectMemberById(gameExchangeMoney.getMemberId());
|
||||
IGamesService iGamesService = gamesService.get(gameExchangeMoney.getPlatformCode() + Constants.SERVICE);
|
||||
|
||||
ExchangeTransferStatusRequestDTO exchangeTransferStatusRequestDTO = new ExchangeTransferStatusRequestDTO();
|
||||
exchangeTransferStatusRequestDTO.setAccount(member.getGameAccount());
|
||||
exchangeTransferStatusRequestDTO.setCurrency(targetCurrency);
|
||||
exchangeTransferStatusRequestDTO.setOrderId(gameExchangeMoney.getTransactionId());
|
||||
exchangeTransferStatusRequestDTO.setAgentId(keyInfo.getCode());
|
||||
exchangeTransferStatusRequestDTO.setAgentKey(keyInfo.getKey());
|
||||
exchangeTransferStatusRequestDTO.setGameExchangeMoneyId(gameExchangeMoney.getId());
|
||||
exchangeTransferStatusRequestDTO.setVendor(platform);
|
||||
exchangeTransferStatusRequestDTO.setKeyInfo(keyInfo);
|
||||
exchangeTransferStatusRequestDTO.setSystemCurrency(gameExchangeMoney.getCurrencyCode());
|
||||
ExchangeTransferStatusResponseDTO statusResponseDTO = iGamesService.exchangeTransferStatus(exchangeTransferStatusRequestDTO);
|
||||
//订单已成功
|
||||
if (StatusType.SUCCESS.getValue().equals(statusResponseDTO.getStatusType())) {
|
||||
gameExchangeMoney.setStep(GameExchangeStep.PLATFORM_TRANSACTION.getCode());
|
||||
gameExchangeMoney.setStepStatus(GameExchangeStepStatus.SUCCESS.getCode());
|
||||
return gameExchangeMoneyService.updateGameExchangeMoney(gameExchangeMoney) > 0;
|
||||
}
|
||||
gameExchangeMoney.setStep(GameExchangeStep.PLATFORM_TRANSACTION.getCode());
|
||||
gameExchangeMoney.setStepStatus(GameExchangeStepStatus.FAILURE.getCode());
|
||||
return gameExchangeMoneyService.updateGameExchangeMoney(gameExchangeMoney) > 0;
|
||||
}
|
||||
|
||||
/**
|
||||
* 下一步处理器
|
||||
*
|
||||
* @return {@link GameExchangeStep }
|
||||
*/
|
||||
@Override
|
||||
public GameExchangeStep nextStepProcessor() {
|
||||
return GameExchangeStep.TENANT_QUOTA_DEDUCTED;
|
||||
}
|
||||
|
||||
/**
|
||||
* 后级处理器
|
||||
*
|
||||
* @return {@link GameExchangeStep }
|
||||
*/
|
||||
@Override
|
||||
public GameExchangeStep backStepProcessor() {
|
||||
{
|
||||
return GameExchangeStep.DEDUCT_BALANCE;
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
|
|
@ -0,0 +1,30 @@
|
|||
package com.ff.game.api.fb.address;
|
||||
|
||||
import com.dtflys.forest.callback.AddressSource;
|
||||
import com.dtflys.forest.http.ForestAddress;
|
||||
import com.dtflys.forest.http.ForestRequest;
|
||||
import com.ff.base.enums.GamePlatforms;
|
||||
import com.ff.game.service.IPlatformService;
|
||||
import org.springframework.stereotype.Component;
|
||||
|
||||
import javax.annotation.Resource;
|
||||
|
||||
|
||||
/**
|
||||
* <a href="https://doc.newsportspro.com/apidoc_data.html#%E5%85%A5%E5%8F%82">对接文档地址</a>
|
||||
*
|
||||
* @author cengy
|
||||
*/
|
||||
@Component
|
||||
public class FBSportsAddress implements AddressSource {
|
||||
|
||||
@Resource
|
||||
private IPlatformService platformService;
|
||||
|
||||
@Override
|
||||
public ForestAddress getAddress(ForestRequest request) {
|
||||
String apiBaseUrl = platformService.get(GamePlatforms.FBSports.getCode())
|
||||
.getUrlInfo().getUrl();
|
||||
return new ForestAddress("https", apiBaseUrl, 443, "fb/data");
|
||||
}
|
||||
}
|
||||
|
|
@ -0,0 +1,102 @@
|
|||
package com.ff.game.api.fb.client;
|
||||
|
||||
import com.dtflys.forest.annotation.*;
|
||||
import com.ff.game.api.fb.address.FBSportsAddress;
|
||||
import com.ff.game.api.fb.dto.*;
|
||||
|
||||
/**
|
||||
* <a href="https://doc.newsportspro.com/apidoc_data.html">数据接口文档</a><br/>
|
||||
* <a href="https://doc.newsportspro.com/h5_pc_doc.html">网页接入文档</a>
|
||||
*
|
||||
* @author cengy
|
||||
*/
|
||||
@Address(source = FBSportsAddress.class)
|
||||
public interface FBSportsClient {
|
||||
/**
|
||||
* 创建投注用户
|
||||
*
|
||||
* @return {@link CreateUserResponse}
|
||||
*/
|
||||
@Post(url = "/api/v2/new/user/create")
|
||||
CreateUserResponse createMember(@JSONBody CreateUserRequest request,
|
||||
@Header("sign") @Var("sign") String sign,
|
||||
@Header("timestamp") @Var("timestamp") long timestamp,
|
||||
@Header("merchantId") @Var("merchantId") String merchantId);
|
||||
|
||||
/**
|
||||
* 用户金额转入到FB体育平台,支持两位小数,最小0.01,必须是正数
|
||||
*
|
||||
* @param request
|
||||
* @param sign
|
||||
* @param timestamp
|
||||
* @param merchantId
|
||||
* @return {@link TransferInResponse}
|
||||
*/
|
||||
@Post(url = "/api/v2/new/transfer/in")
|
||||
TransferInResponse transferIn(@JSONBody TransferInRequest request,
|
||||
@Header("sign") @Var("sign") String sign,
|
||||
@Header("timestamp") @Var("timestamp") long timestamp,
|
||||
@Header("merchantId") @Var("merchantId") String merchantId);
|
||||
|
||||
@Post(url = "/api/v2/new/transfer/out")
|
||||
TransferOutResponse transferOut(@JSONBody TransferOutRequest request,
|
||||
@Header("sign") @Var("sign") String sign,
|
||||
@Header("timestamp") @Var("timestamp") long timestamp,
|
||||
@Header("merchantId") @Var("merchantId") String merchantId);
|
||||
|
||||
@Post(url = "/api/v2/new/user/detail")
|
||||
GetMemberInfoResponse getMemberInfo(@JSONBody GetMemberInfoRequest request,
|
||||
@Header("sign") @Var("sign") String sign,
|
||||
@Header("timestamp") @Var("timestamp") long timestamp,
|
||||
@Header("merchantId") @Var("merchantId") String merchantId);
|
||||
|
||||
/**
|
||||
* 查询转账详情,当转入/转出接口遇到异常,可查询某次转账是否成功
|
||||
*/
|
||||
@Post(url = "/api/v2/transfer/detail")
|
||||
TransferDetailResponse transferDetail(@JSONBody TransferDetailRequest request,
|
||||
@Header("sign") @Var("sign") String sign,
|
||||
@Header("timestamp") @Var("timestamp") long timestamp,
|
||||
@Header("merchantId") @Var("merchantId") String merchantId);
|
||||
|
||||
@Post(url = "/api/v2/service/domain/list")
|
||||
GetUrlResponse getUrl(@JSONBody GetUrlRequest request,
|
||||
@Header("sign") @Var("sign") String sign,
|
||||
@Header("timestamp") @Var("timestamp") long timestamp,
|
||||
@Header("merchantId") @Var("merchantId") String merchantId);
|
||||
|
||||
/**
|
||||
* FB体育用拉取订单文件的方式同步订单数据,FB体育每5分钟生成一次订单文件,
|
||||
* 通过此接口获取某一段时间内的文件ID列表,再通过文件ID获取具体订单数据
|
||||
*/
|
||||
@Post(url = "/api/v2/order/file/ids")
|
||||
OrderFilesResponse orderFiles(@JSONBody OrderFilesRequest request,
|
||||
@Header("sign") @Var("sign") String sign,
|
||||
@Header("timestamp") @Var("timestamp") long timestamp,
|
||||
@Header("merchantId") @Var("merchantId") String merchantId);
|
||||
|
||||
/**
|
||||
* 拉取订单Json数据
|
||||
*/
|
||||
@Post(url = "/api/v2/order/list")
|
||||
OrderInfoResponse getOrderJsonData(@JSONBody OrderInfoRequest request,
|
||||
@Header("sign") @Var("sign") String sign,
|
||||
@Header("timestamp") @Var("timestamp") long timestamp,
|
||||
@Header("merchantId") @Var("merchantId") String merchantId);
|
||||
|
||||
|
||||
/**
|
||||
* 获取用户app端鉴权token和相关服务url,获取到的token用于app调用接口鉴权
|
||||
*
|
||||
* @param request
|
||||
* @param sign
|
||||
* @param timestamp
|
||||
* @param merchantId
|
||||
* @return
|
||||
*/
|
||||
@Post(url = "/api/v2/token/get")
|
||||
GetTokenResponse getToken(@JSONBody GetTokenRequest request,
|
||||
@Header("sign") @Var("sign") String sign,
|
||||
@Header("timestamp") @Var("timestamp") long timestamp,
|
||||
@Header("merchantId") @Var("merchantId") String merchantId);
|
||||
}
|
||||
|
|
@ -0,0 +1,30 @@
|
|||
package com.ff.game.api.fb.dto;
|
||||
|
||||
import com.alibaba.fastjson2.JSON;
|
||||
import lombok.Data;
|
||||
|
||||
import java.io.Serializable;
|
||||
import java.util.LinkedHashMap;
|
||||
import java.util.List;
|
||||
import java.util.Map;
|
||||
|
||||
/**
|
||||
* @author cengy
|
||||
*/
|
||||
@Data
|
||||
public class CreateUserRequest implements Serializable {
|
||||
|
||||
private static final long serialVersionUID = 1L;
|
||||
|
||||
private String merchantUserId;// 渠道用户id,支持40位字符串,必须唯一
|
||||
private List<Integer> currencyIds = null; // 币种id集合 , see enum: currency
|
||||
private Integer oddsLevel = null; // 赔率级别,不传则为默认, see enum: user_odds_level_enum
|
||||
|
||||
public String toJSON() {
|
||||
Map<String, Object> map = new LinkedHashMap<>();
|
||||
map.put("currencyIds", currencyIds);
|
||||
map.put("merchantUserId", merchantUserId);
|
||||
map.put("oddsLevel", oddsLevel);
|
||||
return JSON.toJSONString(map);
|
||||
}
|
||||
}
|
||||
|
|
@ -0,0 +1,19 @@
|
|||
package com.ff.game.api.fb.dto;
|
||||
|
||||
import lombok.Data;
|
||||
|
||||
import java.io.Serializable;
|
||||
|
||||
/**
|
||||
* @author cengy
|
||||
*/
|
||||
@Data
|
||||
public class CreateUserResponse implements Serializable {
|
||||
|
||||
private static final long serialVersionUID = 1L;
|
||||
|
||||
private Boolean success;
|
||||
private Integer data;
|
||||
private Integer code;
|
||||
private String message;
|
||||
}
|
||||
|
|
@ -0,0 +1,9 @@
|
|||
package com.ff.game.api.fb.dto;
|
||||
|
||||
/**
|
||||
* @author cengy
|
||||
*/
|
||||
public class Enums {
|
||||
|
||||
|
||||
}
|
||||
|
|
@ -0,0 +1,27 @@
|
|||
package com.ff.game.api.fb.dto;
|
||||
|
||||
import com.alibaba.fastjson2.JSON;
|
||||
import lombok.Data;
|
||||
|
||||
import java.io.Serializable;
|
||||
import java.util.LinkedHashMap;
|
||||
import java.util.Map;
|
||||
|
||||
/**
|
||||
* @author cengy
|
||||
*/
|
||||
@Data
|
||||
public class GetMemberInfoRequest implements Serializable {
|
||||
private static final long serialVersionUID = 1L;
|
||||
|
||||
/**
|
||||
* 渠道用户id,不能为空
|
||||
*/
|
||||
private String merchantUserId;
|
||||
|
||||
public String toJSON() {
|
||||
Map<String, Object> map = new LinkedHashMap<>();
|
||||
map.put("merchantUserId", merchantUserId);
|
||||
return JSON.toJSONString(map);
|
||||
}
|
||||
}
|
||||
|
|
@ -0,0 +1,38 @@
|
|||
package com.ff.game.api.fb.dto;
|
||||
|
||||
import lombok.Data;
|
||||
|
||||
import java.io.Serializable;
|
||||
import java.math.BigDecimal;
|
||||
import java.util.List;
|
||||
|
||||
/**
|
||||
* @author cengy
|
||||
*/
|
||||
@Data
|
||||
public class GetMemberInfoResponse implements Serializable {
|
||||
private static final long serialVersionUID = 1L;
|
||||
|
||||
private Boolean success;
|
||||
private String message;
|
||||
private MemberInfo data;
|
||||
private Integer code;
|
||||
|
||||
@Data
|
||||
public static class MemberInfo implements Serializable{
|
||||
private static final long serialVersionUID = 1L;
|
||||
private String merchantUserId;
|
||||
private Integer userId; // FB体育用户id
|
||||
private Integer walletType; // 用户钱包类型 , see enum: wallet_type
|
||||
private Integer currencyType; // 用户币种类型 , see enum: currency_type
|
||||
private List<Wallet> wallets; // 钱包集合
|
||||
private Integer oddsLevel;// 赔率级别 , see enum: user_odds_level_enum
|
||||
}
|
||||
@Data
|
||||
public static class Wallet implements Serializable{
|
||||
private static final long serialVersionUID = 1L;
|
||||
private Integer currencyType; // 币种类型 , see enum: currency_type
|
||||
private BigDecimal balance; // 余额
|
||||
private Integer currencyId; // 币种id , see enum: currency
|
||||
}
|
||||
}
|
||||
|
|
@ -0,0 +1,30 @@
|
|||
package com.ff.game.api.fb.dto;
|
||||
|
||||
import com.alibaba.fastjson2.JSON;
|
||||
import lombok.Data;
|
||||
|
||||
import java.io.Serializable;
|
||||
import java.util.LinkedHashMap;
|
||||
import java.util.Map;
|
||||
|
||||
/**
|
||||
* @author cengy
|
||||
*/
|
||||
@Data
|
||||
public class GetTokenRequest implements Serializable {
|
||||
|
||||
private static final long serialVersionUID = 1L;
|
||||
|
||||
private String merchantUserId;
|
||||
// 平台类型,pc,h5, mobile , see enum: plat_form_enum
|
||||
private String platForm;
|
||||
// 客户端用户ip地址,尽可能提供,我们用于风控
|
||||
private String ip; // 可选
|
||||
|
||||
public String toJSON() {
|
||||
Map<String, String> map = new LinkedHashMap<>();
|
||||
map.put("merchantUserId", merchantUserId);
|
||||
map.put("platForm", platForm);
|
||||
return JSON.toJSONString(map);
|
||||
}
|
||||
}
|
||||
|
|
@ -0,0 +1,49 @@
|
|||
package com.ff.game.api.fb.dto;
|
||||
|
||||
import lombok.Data;
|
||||
|
||||
import java.io.Serializable;
|
||||
import java.util.List;
|
||||
|
||||
/**
|
||||
* @author cengy
|
||||
*/
|
||||
@Data
|
||||
public class GetTokenResponse implements Serializable {
|
||||
private static final long serialVersionUID = 1L;
|
||||
|
||||
private Boolean success;
|
||||
private String message;
|
||||
private Integer code;
|
||||
private TokenDTO data;
|
||||
|
||||
@Data
|
||||
public static class TokenDTO implements Serializable {
|
||||
private String token; // 用户鉴权token,用于客户端鉴权
|
||||
private ServerInfo serverInfo; // 服务器地址信息
|
||||
private List<Domain> domains; // 全部服务器地址信息
|
||||
private String themeBgColor; // 主题背景色
|
||||
private String themeFgColor; // 主题前景色
|
||||
private Integer userId; // FB用户ID
|
||||
}
|
||||
|
||||
@Data
|
||||
public static class ServerInfo implements Serializable {
|
||||
private static final long serialVersionUID = 1L;
|
||||
private String apiServerAddress; // app接口服务地址
|
||||
private String apiEmbeddedServerAddress; // app内嵌网页地址
|
||||
private String pushServerAddress; // 推送服务地址
|
||||
private String pcAddress; // PC投注网站地址
|
||||
private String h5Address; // h5投注网站地址
|
||||
private String virtualAddress; // 虚拟体育投注网站地址
|
||||
private String virtualMatchVideoAddress; // 虚拟赛事视频地址
|
||||
private String ouH5Address; // 欧版h5地址
|
||||
private String ouPcAddress; // 欧版pc地址
|
||||
}
|
||||
|
||||
@Data
|
||||
public static class Domain {
|
||||
private Integer type; // 域名类型
|
||||
private List<String> domains; // 域名集合
|
||||
}
|
||||
}
|
||||
|
|
@ -0,0 +1,17 @@
|
|||
package com.ff.game.api.fb.dto;
|
||||
|
||||
import lombok.Data;
|
||||
|
||||
import java.io.Serializable;
|
||||
|
||||
/**
|
||||
* @author cengy
|
||||
*/
|
||||
@Data
|
||||
public class GetUrlRequest implements Serializable {
|
||||
private static final long serialVersionUID = 1L;
|
||||
|
||||
public String toJSON() {
|
||||
return "{}";
|
||||
}
|
||||
}
|
||||
|
|
@ -0,0 +1,33 @@
|
|||
package com.ff.game.api.fb.dto;
|
||||
|
||||
import lombok.Data;
|
||||
|
||||
import java.io.Serializable;
|
||||
import java.util.List;
|
||||
|
||||
/**
|
||||
* @author cengy
|
||||
*/
|
||||
@Data
|
||||
public class GetUrlResponse implements Serializable {
|
||||
private static final long serialVersionUID = 1L;
|
||||
|
||||
private Boolean success;
|
||||
private String message;
|
||||
private List<UrlDTO> data;
|
||||
private Integer code;
|
||||
|
||||
@Data
|
||||
public static class UrlDTO implements Serializable {
|
||||
private static final long serialVersionUID = 1L;
|
||||
private int type; //域名类型,1:API,2:PUSH,3:H5,4:PC,5:IMAGE , see enum: domain_type_enum
|
||||
private List<DomainDTO> domainList; // 域名集合
|
||||
}
|
||||
|
||||
@Data
|
||||
public static class DomainDTO implements Serializable {
|
||||
private static final long serialVersionUID = 1L;
|
||||
private String domain; // 域名
|
||||
private int weight; // 权限值
|
||||
}
|
||||
}
|
||||
|
|
@ -0,0 +1,41 @@
|
|||
package com.ff.game.api.fb.dto;
|
||||
|
||||
import com.alibaba.fastjson2.JSON;
|
||||
import lombok.Data;
|
||||
|
||||
import java.io.Serializable;
|
||||
import java.util.LinkedHashMap;
|
||||
import java.util.Map;
|
||||
|
||||
/**
|
||||
* @author cengy
|
||||
*/
|
||||
@Data
|
||||
public class OrderFilesRequest implements Serializable {
|
||||
private static final long serialVersionUID = 1L;
|
||||
|
||||
/**
|
||||
* 开始时间戳,13位数字,不能为null
|
||||
*/
|
||||
private Long startTime;
|
||||
|
||||
/**
|
||||
* 结束时间戳,13位数字,不能为null
|
||||
*/
|
||||
private Long endTime;
|
||||
|
||||
public String toJSON() {
|
||||
Map<String, Object> map = new LinkedHashMap<>();
|
||||
map.put("endTime", endTime);
|
||||
map.put("startTime", startTime);
|
||||
return JSON.toJSONString(map);
|
||||
// String endTimeStr = endTime ; // 转换为字符串
|
||||
// String startTimeStr = startTime; // 转换为字符串
|
||||
//
|
||||
// String json = "{" +
|
||||
// "\"endTime\": \"" + endTimeStr + "\", " +
|
||||
// "\"startTime\": \"" + startTimeStr + "\"" +
|
||||
// "}";
|
||||
// return json;
|
||||
}
|
||||
}
|
||||
|
|
@ -0,0 +1,27 @@
|
|||
package com.ff.game.api.fb.dto;
|
||||
|
||||
import lombok.Data;
|
||||
|
||||
import java.io.Serializable;
|
||||
import java.util.List;
|
||||
|
||||
/**
|
||||
* @author cengy
|
||||
*/
|
||||
@Data
|
||||
public class OrderFilesResponse implements Serializable {
|
||||
private static final long serialVersionUID = 1L;
|
||||
|
||||
private Boolean success;
|
||||
private String message;
|
||||
private Integer code;
|
||||
|
||||
private List<FileId> data;
|
||||
|
||||
@Data
|
||||
public static class FileId implements Serializable {
|
||||
private static final long serialVersionUID = 1L;
|
||||
private Long fileId;
|
||||
}
|
||||
|
||||
}
|
||||
|
|
@ -0,0 +1,26 @@
|
|||
package com.ff.game.api.fb.dto;
|
||||
|
||||
import com.alibaba.fastjson2.JSON;
|
||||
import lombok.Data;
|
||||
|
||||
import java.io.Serializable;
|
||||
import java.util.LinkedHashMap;
|
||||
import java.util.Map;
|
||||
|
||||
/**
|
||||
* @author cengy
|
||||
*/
|
||||
@Data
|
||||
public class OrderInfoRequest implements Serializable {
|
||||
private static final long serialVersionUID = 1L;
|
||||
/**
|
||||
* 文件Id,需要从/order/file/ids接口获取到
|
||||
*/
|
||||
private Long fileId;
|
||||
|
||||
public String toJSON() {
|
||||
Map<String, Object> map = new LinkedHashMap<>();
|
||||
map.put("fileId", fileId);
|
||||
return JSON.toJSONString(map);
|
||||
}
|
||||
}
|
||||
|
|
@ -0,0 +1,115 @@
|
|||
package com.ff.game.api.fb.dto;
|
||||
|
||||
import lombok.Data;
|
||||
|
||||
import java.io.Serializable;
|
||||
import java.util.List;
|
||||
|
||||
/**
|
||||
* @author cengy
|
||||
*/
|
||||
@Data
|
||||
public class OrderInfoResponse implements Serializable {
|
||||
private static final long serialVersionUID = 1L;
|
||||
|
||||
private Boolean success;
|
||||
private String message;
|
||||
private Integer code;
|
||||
|
||||
private List<OrderDTO> data;
|
||||
|
||||
@Data
|
||||
public static class OrderDTO implements Serializable {
|
||||
private static final long serialVersionUID = 1L;
|
||||
private String id; // 订单号
|
||||
private Integer rejectReason; // 拒单原因码 see enum: order_reject_type
|
||||
private String rejectReasonStr; // 拒单原因
|
||||
private String userId; // FB平台用户ID
|
||||
private String merchantId; // 渠道ID
|
||||
private String merchantUserId; // 渠道用户ID
|
||||
private Integer currency; // 币种 see enum: currency
|
||||
private String exchangeRate; // 汇率快照
|
||||
private Integer seriesType; // 关次类型 ,0 单关、1 串关, see enum: series_type
|
||||
private String betType; // 投注类型
|
||||
private Integer allUp; // 总关数
|
||||
private Integer allUpAlive; // 存活关数
|
||||
private String stakeAmount; // 投注额(本金)
|
||||
private String liabilityStake; // 名义投注额(名义本金)
|
||||
private String settleAmount; // 结算派奖金额
|
||||
private Integer orderStatus; // 订单状态 see enum: order_status
|
||||
private Integer payStatus; // 付款状态
|
||||
private Integer oddsChange; // 是否接受赔率变更 0不接受,1 接受更好赔率,2接受任意赔率 , see enum: odds_change_enum
|
||||
private String device; // 设备类型 (pc、h5、mobile) , see enum: plat_form_enum
|
||||
private String ip; // 投注IP地址
|
||||
private String settleTime; // 订单结算时间
|
||||
private String createTime; // 订单创建时间
|
||||
private String modifyTime; // 订单确认时间
|
||||
private String cancelTime; // 订单取消时间
|
||||
private String thirdRemark; // 第三方备注
|
||||
private String relatedId; // 三方关联ID
|
||||
private String maxWinAmount; // 最大可赢金额
|
||||
private String loseAmount; // 最大赔付金额
|
||||
private Integer rollBackCount; // 回滚次数
|
||||
private Integer itemCount; // 选项数
|
||||
private Integer seriesValue; // 串几关
|
||||
private Integer betNum; // 子单数
|
||||
private String cashOutTotalStake; // 提前结算总本金
|
||||
private String liabilityCashoutStake; // 提前结算名义总本金
|
||||
private String cashOutPayoutStake; // 提前结算总派奖额
|
||||
private String reserveId; // 预约订单单号
|
||||
private Integer cashOutCount; // 提前结算次数
|
||||
private String unitStake; // 每单金额
|
||||
private Integer reserveVersion; // 预约订单版本号
|
||||
private List<BetDTO> betList; // 注单集合
|
||||
}
|
||||
|
||||
@Data
|
||||
public static class BetDTO implements Serializable {
|
||||
private static final long serialVersionUID = 1L;
|
||||
|
||||
private String id; // ID
|
||||
private String orderId; // 订单ID
|
||||
private Integer sportId; // 运动ID
|
||||
private String matchId; // 比赛ID
|
||||
private String matchName; // 比赛名称
|
||||
private Integer period; // 阶段ID
|
||||
private String marketId; // 玩法ID
|
||||
private Integer marketType; // 玩法类型
|
||||
private Integer optionType; // 投注项类型
|
||||
private String optionName; // 选项名称
|
||||
private String marketName; // 玩法名称
|
||||
private String tournamentId; // 联赛ID
|
||||
private String tournamentName; // 联赛名称
|
||||
private String odds; // 欧式赔率
|
||||
private Integer oddsFormat; // 投注时赔率类型
|
||||
private String betOdds; // 投注时赔率
|
||||
private Integer settleStatus; // 结算状态
|
||||
private Integer settleResult; // 结算结果
|
||||
private Boolean isInplay; // 是否滚球
|
||||
private String remark; // 备注
|
||||
private Double p1; // 变量1 (例如:让几个球)
|
||||
private Double p2; // 变量2
|
||||
private Double p3; // 变量3
|
||||
private String extendedParameter; // 亚洲让球线
|
||||
private String extraInfo; // 当前比分
|
||||
private String pendingTime; // 延迟等待时间
|
||||
private String betScore; // 下注当时比分
|
||||
private Integer cancelReason; // 取消原因
|
||||
private String cancelReasonName; // 取消原因文本
|
||||
private Integer matchType; // 赛事类型
|
||||
private String matchTime; // 开赛时间
|
||||
private Integer virtualMatchDay; // 轮次
|
||||
private Integer virtualChampId; // 赛季
|
||||
private Integer virtualLegOrder; // 淘汰赛回合
|
||||
private Integer virtualWeekDay; // 小组赛比赛日
|
||||
private Integer virtualBlockId; // 期
|
||||
private Integer leaguePhase; // 联赛阶段
|
||||
private String maxStake; // 最大投注额
|
||||
private String validSettleStakeAmount; // 有效已结算投注额
|
||||
private String validSettleAmount; // 有效返还额
|
||||
private String cashOutCancelStake; // 提前结算取消总额
|
||||
private Integer walletType; // 钱包类型
|
||||
private Integer version; // 数据变更标记
|
||||
}
|
||||
|
||||
}
|
||||
|
|
@ -0,0 +1,39 @@
|
|||
package com.ff.game.api.fb.dto;
|
||||
|
||||
import com.alibaba.fastjson2.JSON;
|
||||
import lombok.Data;
|
||||
|
||||
import java.io.Serializable;
|
||||
import java.util.LinkedHashMap;
|
||||
import java.util.Map;
|
||||
|
||||
/**
|
||||
* @author cengy
|
||||
*/
|
||||
@Data
|
||||
public class TransferDetailRequest implements Serializable {
|
||||
|
||||
|
||||
/**
|
||||
* 业务id,不能为null
|
||||
*/
|
||||
private String businessId;
|
||||
|
||||
/**
|
||||
* 渠道用户ID,不能为null
|
||||
*/
|
||||
private String merchantUserId;
|
||||
|
||||
/**
|
||||
* 转账类型 , see enum: transfer_type_enum 不能为空
|
||||
*/
|
||||
private String transferType;
|
||||
|
||||
public String toJSON() {
|
||||
Map<String, Object> map = new LinkedHashMap<>();
|
||||
map.put("businessId", businessId);
|
||||
map.put("merchantUserId", merchantUserId);
|
||||
map.put("transferType", transferType);
|
||||
return JSON.toJSONString(map);
|
||||
}
|
||||
}
|
||||
|
|
@ -0,0 +1,39 @@
|
|||
package com.ff.game.api.fb.dto;
|
||||
|
||||
import lombok.Data;
|
||||
|
||||
import java.io.Serializable;
|
||||
import java.math.BigDecimal;
|
||||
|
||||
/**
|
||||
* @author cengy
|
||||
*/
|
||||
@Data
|
||||
public class TransferDetailResponse implements Serializable {
|
||||
private static final long serialVersionUID = 1L;
|
||||
|
||||
private Boolean success;
|
||||
private String message;
|
||||
private TransferDetail data;
|
||||
private Integer code;
|
||||
|
||||
@Data
|
||||
public static class TransferDetail implements Serializable {
|
||||
private static final long serialVersionUID = 1L;
|
||||
|
||||
private Integer id;
|
||||
private Integer userId;
|
||||
private String merchantUserId;
|
||||
private String businessId;
|
||||
// IN 转入
|
||||
// OUT 转出
|
||||
private String transferType;
|
||||
private BigDecimal beforeTransferAmount;
|
||||
private BigDecimal afterTransferAmount;
|
||||
private Integer status; // 状态 , see enum: transfer_status_enum, 1 Successful 0 Failure
|
||||
private Long createTime; // 记录创建时间
|
||||
private Integer currencyId;// 币种id , see enum: currency
|
||||
|
||||
}
|
||||
|
||||
}
|
||||
|
|
@ -0,0 +1,46 @@
|
|||
package com.ff.game.api.fb.dto;
|
||||
|
||||
import com.alibaba.fastjson2.JSON;
|
||||
import lombok.Data;
|
||||
|
||||
import java.io.Serializable;
|
||||
import java.math.BigDecimal;
|
||||
import java.util.LinkedHashMap;
|
||||
import java.util.Map;
|
||||
|
||||
/**
|
||||
* @author cengy
|
||||
*/
|
||||
@Data
|
||||
public class TransferInRequest implements Serializable {
|
||||
|
||||
/**
|
||||
* 转账金额,不能为null
|
||||
* 必须大於或等於0
|
||||
*/
|
||||
private BigDecimal amount;
|
||||
|
||||
/**
|
||||
* 业务id,不能为null
|
||||
*/
|
||||
private String businessId;
|
||||
|
||||
/**
|
||||
* 渠道用户ID,不能为null
|
||||
*/
|
||||
private String merchantUserId;
|
||||
|
||||
/**
|
||||
* 币种id,可不传入
|
||||
*/
|
||||
private Integer currencyId;
|
||||
|
||||
public String toJSON() {
|
||||
Map<String, Object> map = new LinkedHashMap<>();
|
||||
map.put("amount", amount);
|
||||
map.put("businessId", businessId);
|
||||
map.put("currencyId", currencyId);
|
||||
map.put("merchantUserId", merchantUserId);
|
||||
return JSON.toJSONString(map);
|
||||
}
|
||||
}
|
||||
|
|
@ -0,0 +1,20 @@
|
|||
package com.ff.game.api.fb.dto;
|
||||
|
||||
import lombok.Data;
|
||||
|
||||
import java.io.Serializable;
|
||||
import java.math.BigDecimal;
|
||||
|
||||
/**
|
||||
* @author cengy
|
||||
*/
|
||||
@Data
|
||||
public class TransferInResponse implements Serializable {
|
||||
|
||||
private static final long serialVersionUID = 1L;
|
||||
|
||||
private Boolean success;
|
||||
private BigDecimal data;
|
||||
private Integer code;
|
||||
private String message;
|
||||
}
|
||||
|
|
@ -0,0 +1,46 @@
|
|||
package com.ff.game.api.fb.dto;
|
||||
|
||||
import com.alibaba.fastjson2.JSON;
|
||||
import lombok.Data;
|
||||
|
||||
import java.io.Serializable;
|
||||
import java.math.BigDecimal;
|
||||
import java.util.LinkedHashMap;
|
||||
import java.util.Map;
|
||||
|
||||
/**
|
||||
* @author cengy
|
||||
*/
|
||||
@Data
|
||||
public class TransferOutRequest implements Serializable {
|
||||
|
||||
/**
|
||||
* 转账金额,不能为null
|
||||
* 必须大於或等於0
|
||||
*/
|
||||
private BigDecimal amount;
|
||||
|
||||
/**
|
||||
* 业务id,不能为null
|
||||
*/
|
||||
private String businessId;
|
||||
|
||||
/**
|
||||
* 渠道用户ID,不能为null
|
||||
*/
|
||||
private String merchantUserId;
|
||||
|
||||
/**
|
||||
* 币种id,可不传入
|
||||
*/
|
||||
private Integer currencyId;
|
||||
|
||||
public String toJSON() {
|
||||
Map<String, Object> map = new LinkedHashMap<>();
|
||||
map.put("amount", amount);
|
||||
map.put("businessId", businessId);
|
||||
map.put("currencyId", currencyId);
|
||||
map.put("merchantUserId", merchantUserId);
|
||||
return JSON.toJSONString(map);
|
||||
}
|
||||
}
|
||||
|
|
@ -0,0 +1,20 @@
|
|||
package com.ff.game.api.fb.dto;
|
||||
|
||||
import lombok.Data;
|
||||
|
||||
import java.io.Serializable;
|
||||
import java.math.BigDecimal;
|
||||
|
||||
/**
|
||||
* @author cengy
|
||||
*/
|
||||
@Data
|
||||
public class TransferOutResponse implements Serializable {
|
||||
|
||||
private static final long serialVersionUID = 1L;
|
||||
|
||||
private Boolean success;
|
||||
private BigDecimal data;
|
||||
private Integer code;
|
||||
private String message;
|
||||
}
|
||||
|
|
@ -0,0 +1,753 @@
|
|||
package com.ff.game.api.fb.impl;
|
||||
|
||||
import cn.hutool.core.util.IdUtil;
|
||||
import com.ff.base.constant.CacheConstants;
|
||||
import com.ff.base.constant.Constants;
|
||||
import com.ff.base.core.redis.RedisCache;
|
||||
import com.ff.base.enums.*;
|
||||
import com.ff.base.exception.base.ApiException;
|
||||
import com.ff.base.exception.base.BaseException;
|
||||
import com.ff.base.utils.DateUtils;
|
||||
import com.ff.base.utils.StringUtils;
|
||||
import com.ff.base.utils.sign.Md5Utils;
|
||||
import com.ff.base.utils.uuid.IdUtils;
|
||||
import com.ff.game.api.IGamesService;
|
||||
import com.ff.game.api.fb.dto.*;
|
||||
import com.ff.game.api.request.*;
|
||||
import com.ff.game.domain.*;
|
||||
import com.ff.game.service.IGameBettingDetailsService;
|
||||
import com.ff.game.service.IGameExchangeMoneyService;
|
||||
import com.ff.game.service.IGameService;
|
||||
import com.ff.member.domain.Member;
|
||||
import com.ff.member.service.IMemberService;
|
||||
import com.ff.game.api.fb.client.FBSportsClient;
|
||||
import com.ff.utils.TimestampFromString;
|
||||
import lombok.extern.slf4j.Slf4j;
|
||||
import org.springframework.stereotype.Service;
|
||||
import org.springframework.transaction.annotation.Transactional;
|
||||
import org.springframework.util.CollectionUtils;
|
||||
import org.springframework.util.ObjectUtils;
|
||||
|
||||
import javax.annotation.Resource;
|
||||
import java.math.BigDecimal;
|
||||
import java.util.ArrayList;
|
||||
import java.util.Collections;
|
||||
import java.util.List;
|
||||
import java.util.Objects;
|
||||
import java.util.stream.Collectors;
|
||||
|
||||
|
||||
/**
|
||||
* FB体育
|
||||
*
|
||||
* @author shi
|
||||
* @date 2024/10/21
|
||||
*/
|
||||
@Service("FBSportsService")
|
||||
@Slf4j
|
||||
public class FBSportsServiceImpl implements IGamesService {
|
||||
|
||||
@Resource
|
||||
private RedisCache redisCache;
|
||||
|
||||
@Resource
|
||||
private IGameExchangeMoneyService gameExchangeMoneyService;
|
||||
|
||||
@Resource
|
||||
private IGameService gameService;
|
||||
|
||||
|
||||
@Resource
|
||||
private IMemberService memberService;
|
||||
|
||||
@Resource
|
||||
private FBSportsClient fbSportsClient;
|
||||
|
||||
@Resource
|
||||
private IGameBettingDetailsService gameBettingDetailsService;
|
||||
|
||||
/**
|
||||
* 获得就是成功
|
||||
*
|
||||
* @param errorCode 错误代码
|
||||
* @return {@link Boolean }
|
||||
*/
|
||||
private Boolean isSuccess(Integer errorCode) {
|
||||
return 0 == errorCode;
|
||||
}
|
||||
|
||||
String getSign(String bodyJsonString, String merchantId, String merchantApiSecret, long requestTimestamp) {
|
||||
|
||||
String stringThatNeedsToBeSigned = bodyJsonString + "." + merchantId + "." + requestTimestamp + "." + merchantApiSecret;
|
||||
String sign = Md5Utils.md5New(stringThatNeedsToBeSigned);
|
||||
return sign;
|
||||
}
|
||||
|
||||
/**
|
||||
* 创建成员
|
||||
*
|
||||
* @param createMemberRequestDTO 创建成员请求dto
|
||||
* @return {@link Boolean }
|
||||
*/
|
||||
@Override
|
||||
public Boolean createMember(CreateMemberRequestDTO createMemberRequestDTO) {
|
||||
|
||||
long timestamp = System.currentTimeMillis();
|
||||
CreateUserRequest request = new CreateUserRequest();
|
||||
request.setMerchantUserId(createMemberRequestDTO.getAccount());
|
||||
ArrayList<Integer> currencyIds = new ArrayList<>();
|
||||
currencyIds.add(Integer.parseInt(createMemberRequestDTO.getCurrency()));
|
||||
request.setCurrencyIds(currencyIds);
|
||||
String jsonBody = /*SortByAttributeNameASC.get(request)*/ request.toJSON();
|
||||
String sign = getSign(jsonBody,
|
||||
createMemberRequestDTO.getAgentId(),
|
||||
createMemberRequestDTO.getAgentKey(),
|
||||
timestamp
|
||||
);
|
||||
|
||||
CreateUserResponse response = fbSportsClient.createMember(
|
||||
request,
|
||||
sign,
|
||||
timestamp, createMemberRequestDTO.getAgentId());
|
||||
if (isSuccess(response.getCode())) {
|
||||
log.info("创建会员成功, account:{}->{}", createMemberRequestDTO.getAccount(), response.getData());
|
||||
return Boolean.TRUE;
|
||||
}
|
||||
|
||||
log.error("创建会员失败, errorCode:{}, errorMessage:{}", response.getCode(), response.getMessage());
|
||||
throw new ApiException(ErrorCode.Create_Member_Failure.getCode());
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* 按代理id进行交换转账
|
||||
*
|
||||
* @param requestDTO 外汇转账moeny dto
|
||||
* @return {@link Long }
|
||||
*/
|
||||
@Override
|
||||
@Transactional
|
||||
public Long exchangeTransferByAgentId(ExchangeTransferMoneyRequestDTO requestDTO) {
|
||||
|
||||
|
||||
GameExchangeMoney exchangeMoney = gameExchangeMoneyService.selectGameExchangeMoneyById(requestDTO.getGameExchangeId());
|
||||
|
||||
// 转入
|
||||
if (requestDTO.getTransferType().equals(TransferType.GAMES.getCode())) {
|
||||
TransferInRequest request = new TransferInRequest();
|
||||
request.setMerchantUserId(requestDTO.getAccount());
|
||||
request.setAmount(requestDTO.getAmount());
|
||||
request.setBusinessId(requestDTO.getTransactionId());
|
||||
request.setCurrencyId(Integer.parseInt(requestDTO.getCurrency()));
|
||||
long timestamp = System.currentTimeMillis();
|
||||
String jsonBody = request.toJSON();
|
||||
String sign = getSign(jsonBody,
|
||||
requestDTO.getAgentId(),
|
||||
requestDTO.getAgentKey(),
|
||||
timestamp
|
||||
);
|
||||
|
||||
TransferInResponse response = fbSportsClient.transferIn(
|
||||
request,
|
||||
sign,
|
||||
timestamp,
|
||||
requestDTO.getAgentId());
|
||||
if (isSuccess(response.getCode())) {
|
||||
BigDecimal transAmount = requestDTO.getAmount();
|
||||
|
||||
exchangeMoney.setBalance(transAmount);
|
||||
exchangeMoney.setCoinBefore(response.getData().subtract(transAmount));
|
||||
exchangeMoney.setCoinAfter(response.getData());
|
||||
exchangeMoney.setCurrencyBefore(response.getData().subtract(transAmount));
|
||||
exchangeMoney.setCurrencyAfter(response.getData());
|
||||
exchangeMoney.setStep(GameExchangeStep.PLATFORM_TRANSACTION.getCode());
|
||||
exchangeMoney.setStepStatus(GameExchangeStepStatus.SUCCESS.getCode());
|
||||
gameExchangeMoneyService.updateGameExchangeMoney(exchangeMoney);
|
||||
} else {
|
||||
exchangeMoney.setStep(GameExchangeStep.PLATFORM_TRANSACTION.getCode());
|
||||
exchangeMoney.setStepStatus(GameExchangeStepStatus.FAILURE.getCode());
|
||||
gameExchangeMoneyService.updateGameExchangeMoney(exchangeMoney);
|
||||
throw new ApiException(ErrorCode.Transfer_In_Failure.getCode());
|
||||
}
|
||||
} else {
|
||||
// 获取第三方钱包余额
|
||||
MemberInfoRequestDTO memberInfoRequestDTO = MemberInfoRequestDTO.builder()
|
||||
.accounts(requestDTO.getAccount())
|
||||
.agentId(requestDTO.getAgentId())
|
||||
.agentKey(requestDTO.getAgentKey())
|
||||
.build();
|
||||
BigDecimal balance = this.getMemberInfo(memberInfoRequestDTO).getBalance();
|
||||
|
||||
TransferOutRequest request = new TransferOutRequest();
|
||||
request.setMerchantUserId(requestDTO.getAccount());
|
||||
request.setAmount(/*requestDTO.getAmount()*/ balance);
|
||||
request.setBusinessId(requestDTO.getTransactionId());
|
||||
request.setCurrencyId(Integer.parseInt(requestDTO.getCurrency()));
|
||||
|
||||
long timestamp = System.currentTimeMillis();
|
||||
String jsonBody = request.toJSON();
|
||||
String sign = getSign(jsonBody,
|
||||
requestDTO.getAgentId(),
|
||||
requestDTO.getAgentKey(),
|
||||
timestamp
|
||||
);
|
||||
|
||||
TransferOutResponse response = fbSportsClient
|
||||
.transferOut(
|
||||
request,
|
||||
sign,
|
||||
timestamp,
|
||||
requestDTO.getAgentId()
|
||||
);
|
||||
|
||||
|
||||
//判断是否转移成功
|
||||
if (this.isSuccess(response.getCode())) {
|
||||
BigDecimal transAmount = balance;
|
||||
//更新数据
|
||||
exchangeMoney.setBalance(transAmount);
|
||||
exchangeMoney.setCoinBefore(response.getData().add(transAmount));
|
||||
exchangeMoney.setCoinAfter(response.getData());
|
||||
exchangeMoney.setCurrencyBefore(response.getData().add(transAmount));
|
||||
exchangeMoney.setCurrencyAfter(response.getData());
|
||||
exchangeMoney.setStep(GameExchangeStep.PLATFORM_TRANSACTION.getCode());
|
||||
exchangeMoney.setStepStatus(GameExchangeStepStatus.SUCCESS.getCode());
|
||||
gameExchangeMoneyService.updateGameExchangeMoney(exchangeMoney);
|
||||
} else {
|
||||
exchangeMoney.setStep(GameExchangeStep.PLATFORM_TRANSACTION.getCode());
|
||||
exchangeMoney.setStepStatus(GameExchangeStepStatus.FAILURE.getCode());
|
||||
gameExchangeMoneyService.updateGameExchangeMoney(exchangeMoney);
|
||||
throw new ApiException(ErrorCode.Transfer_Out_Failure.getCode());
|
||||
}
|
||||
}
|
||||
return exchangeMoney.getId();
|
||||
}
|
||||
|
||||
/**
|
||||
* 获取会员信息
|
||||
*
|
||||
* @param requestDTO 会员信息请求dto
|
||||
* @return {@link MemberInfoResponseDTO }
|
||||
*/
|
||||
@Override
|
||||
public MemberInfoResponseDTO getMemberInfo(MemberInfoRequestDTO requestDTO) {
|
||||
GetMemberInfoRequest request = new GetMemberInfoRequest();
|
||||
request.setMerchantUserId(requestDTO.getAccounts());
|
||||
long timestamp = System.currentTimeMillis();
|
||||
String jsonBody = request.toJSON();
|
||||
String sign = getSign(jsonBody,
|
||||
requestDTO.getAgentId(),
|
||||
requestDTO.getAgentKey(),
|
||||
timestamp
|
||||
);
|
||||
GetMemberInfoResponse response = fbSportsClient.getMemberInfo(
|
||||
request,
|
||||
sign,
|
||||
timestamp,
|
||||
requestDTO.getAgentId()
|
||||
);
|
||||
//判断是否获取成功
|
||||
if (this.isSuccess(response.getCode())) {
|
||||
BigDecimal balance = new BigDecimal("0.00");
|
||||
|
||||
for (GetMemberInfoResponse.Wallet wallet : response.getData().getWallets()) {
|
||||
balance = balance.add(wallet.getBalance());
|
||||
}
|
||||
return MemberInfoResponseDTO.builder()
|
||||
.status(GameMemberStatus.UNKNOWN.getCode())
|
||||
.balance(balance)
|
||||
.account(requestDTO.getAccounts())
|
||||
.build();
|
||||
} else {
|
||||
throw new ApiException(ErrorCode.Get_Member_Info_Failure.getCode());
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* 获取交易id
|
||||
*
|
||||
* @param transactionIdRequestDTO 事务id请求dto
|
||||
* @return {@link String }
|
||||
*/
|
||||
@Override
|
||||
public String getTransactionId(TransactionIdRequestDTO transactionIdRequestDTO) {
|
||||
return GamePlatforms.FBSports.getCode() + IdUtils.simpleUUID();
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* 无重定向登录
|
||||
*
|
||||
* @param requestDTO 游戏登录
|
||||
* @return {@link String }
|
||||
*/
|
||||
@Override
|
||||
public String loginWithoutRedirect(GamesLogin requestDTO) {
|
||||
GetTokenRequest request = new GetTokenRequest();
|
||||
request.setMerchantUserId(requestDTO.getAccount());
|
||||
request.setPlatForm(/*requestDTO.getPlatform()*/ "mobile"); // pc,h5, mobile , see enum: plat_form_enum
|
||||
long timestamp = System.currentTimeMillis();
|
||||
String jsonBody = request.toJSON();
|
||||
String sign = getSign(jsonBody,
|
||||
requestDTO.getAgentId(),
|
||||
requestDTO.getAgentKey(),
|
||||
timestamp
|
||||
);
|
||||
|
||||
GetTokenResponse response = fbSportsClient.getToken(
|
||||
request,
|
||||
sign,
|
||||
timestamp,
|
||||
requestDTO.getAgentId()
|
||||
);
|
||||
|
||||
if (this.isSuccess(response.getCode())) {
|
||||
String token = response.getData().getToken();
|
||||
Integer userId = response.getData().getUserId();
|
||||
GetTokenResponse.ServerInfo serverInfo = response.getData().getServerInfo();
|
||||
String h5Address = serverInfo.getH5Address();
|
||||
if (StringUtils.isEmpty(h5Address)) {
|
||||
throw new ApiException(ErrorCode.Get_Url_Failure.getCode());
|
||||
}
|
||||
|
||||
return h5Address +
|
||||
"/index.html#/" +
|
||||
"?token=" +
|
||||
token +
|
||||
"&nickname=" +
|
||||
userId +
|
||||
"&apiSrc=" +
|
||||
serverInfo.getApiServerAddress() +
|
||||
"&pushSrc=" +
|
||||
serverInfo.getPushServerAddress() +
|
||||
"&virtualSrc=" +
|
||||
serverInfo.getVirtualAddress() +
|
||||
"&platformName=XK体育";
|
||||
}
|
||||
|
||||
|
||||
/*GetUrlRequest request = new GetUrlRequest();
|
||||
long timestamp = System.currentTimeMillis();
|
||||
String jsonBody = request.toJSON();
|
||||
String sign = getSign(jsonBody,
|
||||
requestDTO.getAgentId(),
|
||||
requestDTO.getAgentKey(),
|
||||
timestamp
|
||||
);
|
||||
GetUrlResponse response = fbSportsClient.getUrl(
|
||||
request,
|
||||
sign,
|
||||
timestamp,
|
||||
requestDTO.getAgentId()
|
||||
);
|
||||
//判断是否获取成功
|
||||
if (this.isSuccess(response.getCode())) {
|
||||
List<GetUrlResponse.UrlDTO> urlDTOS = new ArrayList<>();
|
||||
for (GetUrlResponse.UrlDTO urlDTO : response.getData()) {
|
||||
if (urlDTO.getType() == 3) { // 3:h5
|
||||
urlDTOS.add(urlDTO);
|
||||
}
|
||||
}
|
||||
if (urlDTOS.isEmpty()){
|
||||
throw new ApiException(ErrorCode.Get_Url_Failure.getCode());
|
||||
}
|
||||
int randomIndex = new Random().nextInt(urlDTOS.size());
|
||||
GetUrlResponse.UrlDTO urlDTO = urlDTOS.get(randomIndex);
|
||||
Collections.shuffle(urlDTO.getDomainList());
|
||||
return urlDTO.getDomainList().get(0).getDomain();
|
||||
}*/
|
||||
throw new ApiException(ErrorCode.Get_Url_Failure.getCode());
|
||||
}
|
||||
|
||||
private static final Long GAME_ID = 11111L;
|
||||
|
||||
/**
|
||||
* 获取游戏列表
|
||||
*
|
||||
* @param gamesBaseRequestDTO 游戏请求dto
|
||||
* @return {@link String }
|
||||
*/
|
||||
@Transactional
|
||||
@Override
|
||||
public String getGameList(GamesBaseRequestDTO gamesBaseRequestDTO) {
|
||||
|
||||
Platform platform = gamesBaseRequestDTO.getVendor();
|
||||
Game game = gameService.selectGameById(GAME_ID);
|
||||
//不存在这个游戏
|
||||
if (ObjectUtils.isEmpty(game)) {
|
||||
game = new Game();
|
||||
game.setId(/*IdUtil.getSnowflakeNextId()*/GAME_ID);
|
||||
game.setSortNo(1);
|
||||
//game.setPlatformId(gamePlatform.getId());
|
||||
game.setPlatformCode(platform.getPlatformCode());
|
||||
game.setPlatformType(PlatformType.SPORTS.getCode());
|
||||
game.setGameCode("1");
|
||||
game.setGameSourceType(String.valueOf(1));
|
||||
game.setGameName("FB体育");
|
||||
game.setCreateBy(Constants.SYSTEM);
|
||||
NameInfo nameInfo = new NameInfo();
|
||||
nameInfo.setLang("zh-CN");
|
||||
nameInfo.setName("FB体育");
|
||||
game.setNameInfo(Collections.singletonList(nameInfo));
|
||||
gameService.insertGame(game);
|
||||
}
|
||||
/*GameName gameName = gameNameService.selectGameNameById(GAME_NAME_ID);
|
||||
if (ObjectUtils.isEmpty(gameName)) {
|
||||
gameNameService.insertGameName(GameName.builder()
|
||||
.id(GAME_NAME_ID)
|
||||
.gameId(game.getId())
|
||||
.gameName(game.getGameName())
|
||||
.langCode("zh-CN")
|
||||
.createBy(Constants.SYSTEM)
|
||||
.build());
|
||||
}*/
|
||||
|
||||
return CacheConstants.FB_Sports;
|
||||
}
|
||||
|
||||
/**
|
||||
* 汇兑转移状态
|
||||
*
|
||||
* @param requestDTO 兑换转账请求dto
|
||||
* @return {@link Boolean }
|
||||
*/
|
||||
@Override
|
||||
public ExchangeTransferStatusResponseDTO exchangeTransferStatus(ExchangeTransferStatusRequestDTO requestDTO) {
|
||||
|
||||
GameExchangeMoney gameExchangeMoney = gameExchangeMoneyService.selectGameExchangeMoneyById(requestDTO.getGameExchangeMoneyId());
|
||||
if (null == gameExchangeMoney) {
|
||||
throw new ApiException(ErrorCode.Transfer_Not_Exist.getCode());
|
||||
}
|
||||
Integer status = StatusType.IN_PROGRESS.getValue();
|
||||
|
||||
if (!Objects.equals(gameExchangeMoney.getStatus(), StatusType.SUCCESS.getValue())) {
|
||||
TransferDetailRequest request = new TransferDetailRequest();
|
||||
request.setMerchantUserId(requestDTO.getAccount());
|
||||
request.setTransferType(Objects.equals(gameExchangeMoney.getExchangeType(), TransferType.GAMES.getCode())
|
||||
? "IN" : "OUT");
|
||||
long timestamp = System.currentTimeMillis();
|
||||
String jsonBody = request.toJSON();
|
||||
String sign = getSign(jsonBody,
|
||||
requestDTO.getAgentId(),
|
||||
requestDTO.getAgentKey(),
|
||||
timestamp
|
||||
);
|
||||
TransferDetailResponse response = fbSportsClient.transferDetail(
|
||||
request,
|
||||
sign,
|
||||
timestamp,
|
||||
requestDTO.getAgentId()
|
||||
);
|
||||
if (this.isSuccess(response.getCode())) {
|
||||
status = StatusType.SUCCESS.getValue();
|
||||
} else {
|
||||
status = StatusType.FAILURE.getValue();
|
||||
}
|
||||
}
|
||||
|
||||
return ExchangeTransferStatusResponseDTO.builder()
|
||||
.statusType(status)
|
||||
.balance(gameExchangeMoney.getBalance())
|
||||
.coinBefore(gameExchangeMoney.getCoinBefore())
|
||||
.coinAfter(gameExchangeMoney.getCoinAfter())
|
||||
.build();
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* 按时间获取投注记录
|
||||
*
|
||||
* @param requestDTO 按时间dto投注记录
|
||||
* @return {@link Boolean }
|
||||
*/
|
||||
@Override
|
||||
public Boolean getBetRecordByTime(BetRecordByTimeDTO requestDTO) {
|
||||
Long lend = requestDTO.getEndTime();
|
||||
Long lstart = requestDTO.getStartTime();
|
||||
//betRecordByTimeDTO.setStartTime(lstart);
|
||||
//betRecordByTimeDTO.setEndTime(lend);
|
||||
|
||||
OrderFilesRequest request = new OrderFilesRequest();
|
||||
request.setStartTime(lstart);
|
||||
request.setEndTime(lend);
|
||||
long timestamp = System.currentTimeMillis();
|
||||
String jsonBody = request.toJSON();
|
||||
String sign = getSign(jsonBody,
|
||||
requestDTO.getAgentId(),
|
||||
requestDTO.getAgentKey(),
|
||||
timestamp
|
||||
);
|
||||
OrderFilesResponse orderFilesResponse = fbSportsClient.orderFiles(
|
||||
request,
|
||||
sign,
|
||||
timestamp,
|
||||
requestDTO.getAgentId()
|
||||
);
|
||||
if (this.isSuccess(orderFilesResponse.getCode())) {
|
||||
for (OrderFilesResponse.FileId fileId : orderFilesResponse.getData()) {
|
||||
try {
|
||||
getOrderData(fileId.getFileId(), requestDTO);
|
||||
} catch (Exception e) {
|
||||
log.error("获取订单数据失败,fileId:{},agentId:{}", fileId, requestDTO.getAgentId());
|
||||
}
|
||||
}
|
||||
return true;
|
||||
}
|
||||
log.error("获取订单文件失败,agentId:{}", requestDTO.getAgentId());
|
||||
return false;
|
||||
}
|
||||
|
||||
void getOrderData(Long fileId, BetRecordByTimeDTO requestDTO) {
|
||||
OrderInfoRequest request = new OrderInfoRequest();
|
||||
request.setFileId(fileId);
|
||||
long timestamp = System.currentTimeMillis();
|
||||
String jsonBody = request.toJSON();
|
||||
String sign = getSign(jsonBody,
|
||||
requestDTO.getAgentId(),
|
||||
requestDTO.getAgentKey(),
|
||||
timestamp
|
||||
);
|
||||
|
||||
OrderInfoResponse orderInfoResponse = fbSportsClient.getOrderJsonData(
|
||||
request,
|
||||
sign,
|
||||
timestamp,
|
||||
requestDTO.getAgentId()
|
||||
);
|
||||
if (!this.isSuccess(orderInfoResponse.getCode())) {
|
||||
return;
|
||||
}
|
||||
List<OrderInfoResponse.OrderDTO> settledOrderList = new ArrayList<>();
|
||||
for (OrderInfoResponse.OrderDTO orderDTO : orderInfoResponse.getData()) {
|
||||
// 0 Created 未确认
|
||||
// 1 Confirming 确认中
|
||||
// 2 Rejected 已拒单
|
||||
// 3 Canceled 已取消
|
||||
// 4 Confirmed 已接单
|
||||
// 5 Settled 已结算
|
||||
if (!orderDTO.getOrderStatus().equals(5)) { // 已结算
|
||||
continue;
|
||||
}
|
||||
settledOrderList.add(orderDTO);
|
||||
}
|
||||
this.batchInsert(settledOrderList, requestDTO);
|
||||
}
|
||||
|
||||
/**
|
||||
* 按历史时间获取投注记录
|
||||
*
|
||||
* @param requestDTO 按时间dto投注记录
|
||||
* @return {@link Boolean }
|
||||
*/
|
||||
@Override
|
||||
public Boolean getBetRecordByHistoryTime(BetRecordByTimeDTO requestDTO) {
|
||||
Long lend = requestDTO.getEndTime();
|
||||
Long lstart = requestDTO.getStartTime();
|
||||
//betRecordByTimeDTO.setStartTime(lstart);
|
||||
//betRecordByTimeDTO.setEndTime(lend);
|
||||
|
||||
OrderFilesRequest request = new OrderFilesRequest();
|
||||
request.setStartTime(lstart);
|
||||
request.setEndTime(lend);
|
||||
long timestamp = System.currentTimeMillis();
|
||||
String jsonBody = request.toJSON();
|
||||
String sign = getSign(jsonBody,
|
||||
requestDTO.getAgentId(),
|
||||
requestDTO.getAgentKey(),
|
||||
timestamp
|
||||
);
|
||||
OrderFilesResponse orderFilesResponse = fbSportsClient.orderFiles(
|
||||
request,
|
||||
sign,
|
||||
timestamp,
|
||||
requestDTO.getAgentId()
|
||||
);
|
||||
if (this.isSuccess(orderFilesResponse.getCode())) {
|
||||
for (OrderFilesResponse.FileId fileId : orderFilesResponse.getData()) {
|
||||
try {
|
||||
getOrderData(fileId.getFileId(), requestDTO);
|
||||
} catch (Exception e) {
|
||||
log.error("获取订单数据失败,fileId:{},agentId:{}", fileId, requestDTO.getAgentId());
|
||||
}
|
||||
}
|
||||
return true;
|
||||
}
|
||||
log.error("获取订单文件失败,agentId:{}", requestDTO.getAgentId());
|
||||
return false;
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* 赠送免费局数
|
||||
*
|
||||
* @param createFreeSpinRequest 创建自由旋转请求
|
||||
* @return {@link Boolean }
|
||||
*/
|
||||
@Override
|
||||
public Boolean createFreeSpin(CreateFreeSpinRequestDTO createFreeSpinRequest) {
|
||||
throw new BaseException("暂不支持免费局数");
|
||||
}
|
||||
|
||||
/**
|
||||
* 获取游戏详细信息
|
||||
*
|
||||
* @param getGameDetailRequestDTO 获取游戏详细信息请求dto
|
||||
* @return {@link GetGameDetailResponseDTO }
|
||||
*/
|
||||
@Override
|
||||
public GetGameDetailResponseDTO getGameDetail(GetGameDetailRequestDTO getGameDetailRequestDTO) {
|
||||
throw new ApiException(ErrorCode.PLATFORM_NOT_METHODS.getCode());
|
||||
}
|
||||
|
||||
/**
|
||||
* 强制会员从游戏注销
|
||||
*
|
||||
* @param kickMemberRequestDTO 踢会员请求dto
|
||||
* @return {@link Boolean }
|
||||
*/
|
||||
@Override
|
||||
public Boolean kickMember(KickMemberRequestDTO kickMemberRequestDTO) {
|
||||
|
||||
return Boolean.FALSE;
|
||||
}
|
||||
|
||||
/**
|
||||
* 踢成员全部
|
||||
*
|
||||
* @param kickMemberAllDTO 踢成员全部dto
|
||||
* @return {@link Boolean }
|
||||
*/
|
||||
@Override
|
||||
public Boolean kickMemberAll(KickMemberAllDTO kickMemberAllDTO) {
|
||||
throw new ApiException(ErrorCode.PLATFORM_NOT_METHODS.getCode());
|
||||
}
|
||||
|
||||
/**
|
||||
* 免费游戏玩家使用的纪录
|
||||
*
|
||||
* @param getFreeSpinDashflowRequestDTO 获取自由旋转dashflow请求dto
|
||||
* @return {@link List }<{@link GameFreeRecord }>
|
||||
*/
|
||||
@Override
|
||||
public List<GameFreeRecord> getFreeSpinDashflow(GetFreeSpinDashflowRequestDTO getFreeSpinDashflowRequestDTO) {
|
||||
throw new ApiException(ErrorCode.PLATFORM_NOT_METHODS.getCode());
|
||||
}
|
||||
|
||||
/**
|
||||
* 取消赠送免费局数
|
||||
*
|
||||
* @param cancelFreeSpinRequestDTO 取消免费旋转请求
|
||||
* @return {@link Boolean }
|
||||
*/
|
||||
@Override
|
||||
public Boolean cancelFreeSpin(CancelFreeSpinRequestDTO cancelFreeSpinRequestDTO) {
|
||||
throw new ApiException(ErrorCode.PLATFORM_NOT_METHODS.getCode());
|
||||
}
|
||||
|
||||
/**
|
||||
* 游戏演示登录
|
||||
*
|
||||
* @param gameDemoLoginRequestDTO 游戏演示登录请求dto
|
||||
* @return {@link GameDemoLoginResponseDTO }
|
||||
*/
|
||||
@Override
|
||||
public GameDemoLoginResponseDTO gameDemoLogin(GameDemoLoginRequestDTO gameDemoLoginRequestDTO) {
|
||||
throw new ApiException(ErrorCode.PLATFORM_NOT_METHODS.getCode());
|
||||
}
|
||||
|
||||
/**
|
||||
* 批量插入
|
||||
*
|
||||
* @param settledOrderList 投注记录
|
||||
*/
|
||||
private void batchInsert(List<OrderInfoResponse.OrderDTO> settledOrderList, BetRecordByTimeDTO betRecordByTimeDTO) {
|
||||
List<GameBettingDetails> gameBettingDetails = new ArrayList<>();
|
||||
List<String> wagersIds = new ArrayList<>();
|
||||
//数据组装
|
||||
List<OrderInfoResponse.OrderDTO> dataList = settledOrderList;
|
||||
if (CollectionUtils.isEmpty(dataList)) {
|
||||
return;
|
||||
}
|
||||
|
||||
//数据转化
|
||||
for (OrderInfoResponse.OrderDTO dataBean : dataList) {
|
||||
GameBettingDetails bettingDetails = this.dataBuild(GamesDataBuildDTO.builder()
|
||||
.platform(betRecordByTimeDTO.getVendor())
|
||||
.data(dataBean).build());
|
||||
if (!ObjectUtils.isEmpty(bettingDetails)) {
|
||||
bettingDetails.setId(IdUtil.getSnowflakeNextId());
|
||||
gameBettingDetails.add(bettingDetails);
|
||||
}
|
||||
wagersIds.add(dataBean.getId());
|
||||
}
|
||||
if (CollectionUtils.isEmpty(gameBettingDetails)) {
|
||||
return;
|
||||
}
|
||||
//查询重复数据id
|
||||
List<String> removeWagersIds = gameBettingDetailsService
|
||||
.selectGameBettingDetailsByWagersId(wagersIds, GamePlatforms.FBSports.getCode());
|
||||
//用steam流清除list中与wagersIds集合相同的数据
|
||||
gameBettingDetails = gameBettingDetails.stream()
|
||||
.filter(detail -> !removeWagersIds.contains(detail.getWagersId()))
|
||||
.collect(Collectors.toList());
|
||||
if (!CollectionUtils.isEmpty(gameBettingDetails)) {
|
||||
gameBettingDetailsService.batchInsert(gameBettingDetails);
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* 数据构建
|
||||
*
|
||||
* @param gamesDataBuildDTO 数据
|
||||
* @return {@link GameBettingDetails }
|
||||
*/
|
||||
@Override
|
||||
public GameBettingDetails dataBuild(GamesDataBuildDTO gamesDataBuildDTO) {
|
||||
|
||||
//转化类
|
||||
OrderInfoResponse.OrderDTO dataBean = (OrderInfoResponse.OrderDTO) gamesDataBuildDTO.getData();
|
||||
Member member = memberService.selectMemberByGameAccount(dataBean.getMerchantUserId());
|
||||
if (ObjectUtils.isEmpty(member)) {
|
||||
return null;
|
||||
}
|
||||
List<Game> gameList = redisCache.getCacheList(CacheConstants.FB_Sports);
|
||||
Game game = gameList.get(0);
|
||||
BigDecimal originPayoffAmount = new BigDecimal(dataBean.getSettleAmount());
|
||||
BigDecimal betAmount = new BigDecimal(dataBean.getStakeAmount());
|
||||
|
||||
int compareResult = originPayoffAmount.compareTo(betAmount);
|
||||
long payoffTime = TimestampFromString.to(dataBean.getSettleTime());
|
||||
long createTime = TimestampFromString.to(dataBean.getCreateTime());
|
||||
Platform platform = gamesDataBuildDTO.getPlatform();
|
||||
String systemCurrency = platform.getOurCurrency(dataBean.getCurrency().toString());
|
||||
//数据构造
|
||||
GameBettingDetails gameBettingDetails = GameBettingDetails.builder()
|
||||
.tenantKey(member.getTenantKey())
|
||||
//保存我们的币种id
|
||||
.currencyCode(systemCurrency)
|
||||
.memberId(member.getId())
|
||||
.gameCode(game.getGameCode())
|
||||
.gameType(8) // 体育
|
||||
.platformCode(GamePlatforms.FBSports.getCode())
|
||||
.gameId(game.getGameId())
|
||||
.gameName(game.getGameName())
|
||||
.gameStatus(compareResult > 0 ? GameStatus.WIN.getCode() : compareResult < 0 ? GameStatus.FAIL.getCode() : GameStatus.FLAT.getCode())
|
||||
.gameStatusType(1) // 一般下注
|
||||
.gameCurrencyCode(dataBean.getCurrency().toString())
|
||||
.account(dataBean.getMerchantUserId())
|
||||
.wagersId(dataBean.getId())
|
||||
.wagersTime(createTime)
|
||||
.betAmount(betAmount)
|
||||
.payoffTime(payoffTime)
|
||||
.payoffAmount(originPayoffAmount.abs())
|
||||
.settlementTime(payoffTime)
|
||||
.turnover(betAmount)
|
||||
.orderNo(dataBean.getId())
|
||||
.settlementStatus(SettlementStatusEnum.COMPLETED.getCode())
|
||||
.build();
|
||||
gameBettingDetails.setCreateBy(Constants.SYSTEM);
|
||||
gameBettingDetails.setCreateTime(DateUtils.getNowDate());
|
||||
return gameBettingDetails;
|
||||
}
|
||||
}
|
||||
|
|
@ -89,6 +89,11 @@ public interface FCClient {
|
|||
ApiCFBalanceTransferResponseDTO exchangeTransferByAgentId(@JSONBody Map<String, Object> parameters);
|
||||
|
||||
|
||||
@Post(url = "/GetSingleBill")
|
||||
ApiCFBalanceTransferStatusResponseDTO exchangeTransferStatus(@JSONBody Map<String, Object> parameters);
|
||||
|
||||
|
||||
|
||||
/**
|
||||
* 按时间获取投注记录
|
||||
*
|
||||
|
|
|
|||
|
|
@ -0,0 +1,96 @@
|
|||
package com.ff.game.api.fc.dto;
|
||||
|
||||
import com.fasterxml.jackson.annotation.JsonProperty;
|
||||
import lombok.Data;
|
||||
|
||||
import java.math.BigDecimal;
|
||||
|
||||
/**
|
||||
* api cfbalance传输状态响应dto
|
||||
*
|
||||
* @author shi
|
||||
* @date 2025/04/08
|
||||
*/
|
||||
@Data
|
||||
public class ApiCFBalanceTransferStatusResponseDTO {
|
||||
|
||||
/**
|
||||
* 请求结果代码
|
||||
* 0 表示成功
|
||||
*/
|
||||
@JsonProperty("Result")
|
||||
private int result;
|
||||
|
||||
/**
|
||||
* 银行 ID
|
||||
*/
|
||||
@JsonProperty("bankID")
|
||||
private int bankId;
|
||||
|
||||
/**
|
||||
* 交易 ID
|
||||
*/
|
||||
@JsonProperty("trsID")
|
||||
private String trsId;
|
||||
|
||||
/**
|
||||
* 操作类型(如存款、取款等)
|
||||
*/
|
||||
@JsonProperty("action")
|
||||
private String action;
|
||||
|
||||
/**
|
||||
* 交易的点数
|
||||
*/
|
||||
@JsonProperty("points")
|
||||
private BigDecimal points;
|
||||
|
||||
/**
|
||||
* 用户账号
|
||||
*/
|
||||
@JsonProperty("account")
|
||||
private String account;
|
||||
|
||||
/**
|
||||
* 交易状态
|
||||
* 1: 成功,其他值表示失败
|
||||
*/
|
||||
@JsonProperty("status")
|
||||
private int status;
|
||||
|
||||
/**
|
||||
* 交易前点数
|
||||
*/
|
||||
@JsonProperty("beforepoints")
|
||||
private BigDecimal beforePoints;
|
||||
|
||||
/**
|
||||
* 交易后点数
|
||||
*/
|
||||
@JsonProperty("afterpoints")
|
||||
private BigDecimal afterPoints;
|
||||
|
||||
/**
|
||||
* 创建日期
|
||||
*/
|
||||
@JsonProperty("cdate")
|
||||
private String createDate;
|
||||
|
||||
/**
|
||||
* 变更日期
|
||||
*/
|
||||
@JsonProperty("bdate")
|
||||
private String updateDate;
|
||||
|
||||
/**
|
||||
* 事件 ID
|
||||
*/
|
||||
@JsonProperty("eventID")
|
||||
private String eventId;
|
||||
|
||||
/**
|
||||
* 货币类型
|
||||
*/
|
||||
@JsonProperty("currency")
|
||||
private String currency;
|
||||
}
|
||||
|
|
@ -37,7 +37,7 @@ public class ApiFCGameListResponseDTO {
|
|||
/**
|
||||
* 系统游戏id
|
||||
*/
|
||||
private Long systemGameId;
|
||||
private String systemGameId;
|
||||
/**
|
||||
* 游戏id
|
||||
*/
|
||||
|
|
|
|||
|
|
@ -14,6 +14,7 @@ import com.ff.base.utils.StringUtils;
|
|||
import com.ff.base.utils.sign.Md5Utils;
|
||||
import com.ff.config.KeyConfig;
|
||||
import com.ff.game.api.IGamesService;
|
||||
import com.ff.game.api.dg.dto.DGTransactionResponseDTO;
|
||||
import com.ff.game.api.fc.client.FCClient;
|
||||
import com.ff.game.api.fc.dto.*;
|
||||
import com.ff.game.api.request.*;
|
||||
|
|
@ -258,7 +259,6 @@ public class GamesFCServiceImpl implements IGamesService {
|
|||
|
||||
ApiFCGameListResponseDTO.GameDetails gameDetails = integerGameDetailsMap.get(gameIdKey);
|
||||
Game game = Game.builder()
|
||||
//.platformId(gamePlatform.getId())
|
||||
.platformCode(GamePlatforms.FC.getCode())
|
||||
.gameCode(gameIdKey)
|
||||
.build();
|
||||
|
|
@ -269,41 +269,28 @@ public class GamesFCServiceImpl implements IGamesService {
|
|||
game.setGameSourceType(String.valueOf(PlatformType.ELECTRONIC.getCode()));
|
||||
game.setFreespin(Boolean.FALSE);
|
||||
game.setDemoStatus(Boolean.TRUE);
|
||||
game.setPlatformCode(GamePlatforms.FC.getCode());
|
||||
game.setPlatformType(platformType);
|
||||
|
||||
game.setSortNo(gameService.selectMaxSortNo(platformType, GamePlatforms.FC.getCode()) + 1);
|
||||
game.setGameName(gameDetails.getGameNameOfChinese());
|
||||
game.setCreateBy(Constants.SYSTEM);
|
||||
|
||||
game.setPlatformCode(GamePlatforms.FC.getCode());
|
||||
game.setPlatformType(platformType);
|
||||
List<NameInfo> nameInfos = new ArrayList<>();
|
||||
nameInfos.add(NameInfo.builder().lang("zh-CN").name(gameDetails.getGameNameOfChinese()).build());
|
||||
nameInfos.add(NameInfo.builder().lang("en-US").name(gameDetails.getGameNameOfEnglish()).build());
|
||||
game.setNameInfo(nameInfos);
|
||||
game.setGameId(StringUtils.addSuffix(GamePlatforms.FC.getCode(), gameIdKey));
|
||||
gameService.insertGame(game);
|
||||
} else {
|
||||
game = games.get(0);
|
||||
}
|
||||
gameDetails.setSystemGameId(game.getId());
|
||||
List<NameInfo> nameInfos = new ArrayList<>();
|
||||
nameInfos.add(NameInfo.builder().lang("zh-CN").name(gameDetails.getGameNameOfChinese()).build());
|
||||
nameInfos.add(NameInfo.builder().lang("en-US").name(gameDetails.getGameNameOfEnglish()).build());
|
||||
game.setNameInfo(nameInfos);
|
||||
gameService.updateGame(game);
|
||||
|
||||
/*List<GameName> gameNames = gameNameService.selectGameNameList(GameName.builder().gameId(game.getId()).gameName(gameDetails.getGameNameOfChinese()).build());
|
||||
if (CollectionUtils.isEmpty(gameNames)) {
|
||||
gameNameService.insertGameName(GameName.builder()
|
||||
.gameId(game.getId())
|
||||
.gameName(gameDetails.getGameNameOfChinese())
|
||||
.langCode("zh-CN")
|
||||
.createBy(Constants.SYSTEM)
|
||||
.build());
|
||||
}
|
||||
gameNames = gameNameService.selectGameNameList(GameName.builder().gameId(game.getId()).gameName(gameDetails.getGameNameOfEnglish()).build());
|
||||
if (CollectionUtils.isEmpty(gameNames)) {
|
||||
gameNameService.insertGameName(GameName.builder()
|
||||
.gameId(game.getId())
|
||||
.gameName(gameDetails.getGameNameOfEnglish())
|
||||
.langCode("en-US")
|
||||
.createBy(Constants.SYSTEM)
|
||||
.build());
|
||||
}*/
|
||||
|
||||
gameDetails.setSystemGameId(game.getGameId());
|
||||
gameDetails.setGameId(gameIdKey);
|
||||
gameDetailsList.add(gameDetails);
|
||||
}
|
||||
|
|
@ -330,36 +317,9 @@ public class GamesFCServiceImpl implements IGamesService {
|
|||
public Long exchangeTransferByAgentId(ExchangeTransferMoneyRequestDTO exchangeTransferMoneyRequestDTO) {
|
||||
log.info("GamesFCServiceImpl [exchangeTransferByAgentId] 请求参数 {}", exchangeTransferMoneyRequestDTO);
|
||||
|
||||
// GameSecretKeyCurrency currencyDTO = gameSecretKeyCurrencyService.findByGameSecretKeyCurrencyDTO(GameSecretKeyCurrencyDTO.builder()
|
||||
// .platformCode(GamePlatforms.FC.getInfo())
|
||||
// .code(exchangeTransferMoneyRequestDTO.getAgentId())
|
||||
// .currency(exchangeTransferMoneyRequestDTO.getCurrency())
|
||||
// .build());
|
||||
|
||||
Member member = memberService.selectMemberByGameAccount(exchangeTransferMoneyRequestDTO.getAccount());
|
||||
String transactionId = gameExchangeMoneyService.getTransactionId(GamePlatforms.FC.getInfo(), 30);
|
||||
List<GameExchangeMoney> gameExchangeMonies = gameExchangeMoneyService.selectGameExchangeMoneyList(
|
||||
GameExchangeMoney.builder()
|
||||
.tenantKey(exchangeTransferMoneyRequestDTO.getTenantKey())
|
||||
.orderId(exchangeTransferMoneyRequestDTO.getOrderId())
|
||||
.build()
|
||||
);
|
||||
Assert.isTrue(CollectionUtils.isEmpty(gameExchangeMonies), "订单号重复");
|
||||
GameExchangeMoney exchangeMoney = gameExchangeMoneyService.selectGameExchangeMoneyById(exchangeTransferMoneyRequestDTO.getGameExchangeId());
|
||||
|
||||
//获取下一个自增id
|
||||
GameExchangeMoney exchangeMoney = GameExchangeMoney
|
||||
.builder()
|
||||
.tenantKey(exchangeTransferMoneyRequestDTO.getTenantKey())
|
||||
.orderId(exchangeTransferMoneyRequestDTO.getOrderId())
|
||||
.quota(exchangeTransferMoneyRequestDTO.getQuota())
|
||||
.balance(exchangeTransferMoneyRequestDTO.getAmount())
|
||||
.exchangeType(exchangeTransferMoneyRequestDTO.getTransferType())
|
||||
.currencyCode(exchangeTransferMoneyRequestDTO.getSystemCurrency())
|
||||
.memberId(member.getId())
|
||||
.transactionId(transactionId)
|
||||
.platformCode(GamePlatforms.FC.getInfo())
|
||||
.build();
|
||||
exchangeMoney.setCreateBy(Constants.SYSTEM);
|
||||
|
||||
//获取余额
|
||||
String type = TransferType.ALL.getCode().equals(exchangeTransferMoneyRequestDTO.getTransferType()) ? FCTransferType.TRANSFER_OUT_ALL.getValue() : FCTransferType.TRANSFER_OUT.getValue();
|
||||
|
|
@ -370,7 +330,7 @@ public class GamesFCServiceImpl implements IGamesService {
|
|||
|
||||
//获取当前游戏币
|
||||
MemberInfoRequestDTO gamesBaseRequestDTO = MemberInfoRequestDTO.builder()
|
||||
.accounts(member.getGameAccount())
|
||||
.accounts(exchangeTransferMoneyRequestDTO.getAccount())
|
||||
.agentId(exchangeTransferMoneyRequestDTO.getAgentId())
|
||||
.agentKey(exchangeTransferMoneyRequestDTO.getAgentKey())
|
||||
.currency(exchangeTransferMoneyRequestDTO.getCurrency())
|
||||
|
|
@ -384,7 +344,7 @@ public class GamesFCServiceImpl implements IGamesService {
|
|||
|
||||
Map<String, Object> paramsMap = new HashMap<>();
|
||||
paramsMap.put("MemberAccount", exchangeTransferMoneyRequestDTO.getAccount());
|
||||
paramsMap.put("TrsID", transactionId);
|
||||
paramsMap.put("TrsID", exchangeTransferMoneyRequestDTO.getTransactionId());
|
||||
paramsMap.put("AllOut", type);
|
||||
paramsMap.put("Points", amount);
|
||||
paramsMap.putAll(getKeyMap(paramsMap, gamesBaseRequestDTO.getAgentKey(), gamesBaseRequestDTO.getCurrency(), gamesBaseRequestDTO.getAgentId()));
|
||||
|
|
@ -398,25 +358,60 @@ public class GamesFCServiceImpl implements IGamesService {
|
|||
exchangeMoney.setCoinAfter(transferResponseDTO.getAfterPoint());
|
||||
exchangeMoney.setCurrencyBefore(exchangeMoney.getCoinBefore());
|
||||
exchangeMoney.setCurrencyAfter(exchangeMoney.getCoinAfter());
|
||||
exchangeMoney.setStatus(StatusType.SUCCESS.getValue());
|
||||
|
||||
gameExchangeMoneyService.insertGameExchangeMoney(exchangeMoney);
|
||||
exchangeMoney.setStep(GameExchangeStep.PLATFORM_TRANSACTION.getCode());
|
||||
exchangeMoney.setStepStatus(GameExchangeStepStatus.SUCCESS.getCode());
|
||||
gameExchangeMoneyService.updateGameExchangeMoney(exchangeMoney);
|
||||
} else {
|
||||
exchangeMoney.setStep(GameExchangeStep.PLATFORM_TRANSACTION.getCode());
|
||||
exchangeMoney.setStepStatus(GameExchangeStepStatus.FAILURE.getCode());
|
||||
gameExchangeMoneyService.updateGameExchangeMoney(exchangeMoney);
|
||||
log.error("GamesFCServiceImpl [exchangeTransferByAgentId] 金额转移失败,错误代码{}", transferResponseDTO.getResult());
|
||||
throw new ApiException(ErrorCode.BALANCE_TRANSFER_FAILED.getCode());
|
||||
}
|
||||
return exchangeMoney.getId();
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* 获取交易id
|
||||
*
|
||||
* @param transactionIdRequestDTO 事务id请求dto
|
||||
* @return {@link String }
|
||||
*/
|
||||
@Override
|
||||
public String getTransactionId(TransactionIdRequestDTO transactionIdRequestDTO) {
|
||||
return gameExchangeMoneyService.getTransactionId(GamePlatforms.FC.getInfo(), 30);
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* 汇兑转移状态
|
||||
*
|
||||
* @param exchangeTransferMoneyRequestDTO 兑换转账请求dto
|
||||
* @return {@link Boolean }
|
||||
* @return {@link ExchangeTransferStatusResponseDTO }
|
||||
*/
|
||||
@Override
|
||||
public Boolean exchangeTransferStatus(ExchangeTransferStatusRequestDTO exchangeTransferMoneyRequestDTO) {
|
||||
throw new ApiException(ErrorCode.PLATFORM_NOT_METHODS.getCode());
|
||||
public ExchangeTransferStatusResponseDTO exchangeTransferStatus(ExchangeTransferStatusRequestDTO exchangeTransferMoneyRequestDTO) {
|
||||
log.info("GamesDGServiceImpl [exchangeTransferStatus] 请求参数 {}", exchangeTransferMoneyRequestDTO);
|
||||
|
||||
Map<String, Object> paramsMap = new LinkedHashMap<>();
|
||||
paramsMap.put("TrsID", exchangeTransferMoneyRequestDTO.getOrderId());
|
||||
paramsMap.putAll(getKeyMap(paramsMap, exchangeTransferMoneyRequestDTO.getAgentKey(), exchangeTransferMoneyRequestDTO.getCurrency(), exchangeTransferMoneyRequestDTO.getAgentId()));
|
||||
|
||||
ApiCFBalanceTransferStatusResponseDTO apiCFBalanceTransferStatusResponseDTO = FCClient.exchangeTransferStatus(paramsMap);
|
||||
Integer status = StatusType.IN_PROGRESS.getValue();
|
||||
if (this.getIsSuccess(apiCFBalanceTransferStatusResponseDTO.getResult())) {
|
||||
status = StatusType.SUCCESS.getValue();
|
||||
} else {
|
||||
status = StatusType.FAILURE.getValue();
|
||||
}
|
||||
|
||||
return ExchangeTransferStatusResponseDTO.builder()
|
||||
.statusType(status)
|
||||
.balance(apiCFBalanceTransferStatusResponseDTO.getPoints())
|
||||
.coinBefore(apiCFBalanceTransferStatusResponseDTO.getBeforePoints())
|
||||
.coinAfter(apiCFBalanceTransferStatusResponseDTO.getAfterPoints())
|
||||
.build();
|
||||
|
||||
}
|
||||
|
||||
|
|
@ -430,37 +425,29 @@ public class GamesFCServiceImpl implements IGamesService {
|
|||
@Override
|
||||
public Boolean getBetRecordByTime(BetRecordByTimeDTO betRecordByTimeDTO) {
|
||||
|
||||
// List<GameSecretKeyCurrencyDTO> gameSecretKeyCurrencies = gameSecretKeyCurrencyService
|
||||
// .findByGameSecretKeyCurrencyDTOList(GameSecretKeyCurrencyDTO.builder()
|
||||
// .platformCode(GamePlatforms.FC.getInfo())
|
||||
// .build());
|
||||
|
||||
Platform platform = betRecordByTimeDTO.getVendor();
|
||||
//for (KeyInfo keyInfo : platform.getKeyInfo()) {
|
||||
// for (GameSecretKeyCurrency gameSecretKeyCurrency : gameSecretKeyCurrencies) {
|
||||
String startTime = DateUtils.convertTimeZone(betRecordByTimeDTO.getStartTime(), "America/New_York", DateUtils.YYYY_MM_DD_HH_MM_SS);
|
||||
String endTime = DateUtils.convertTimeZone(betRecordByTimeDTO.getEndTime(), "America/New_York", DateUtils.YYYY_MM_DD_HH_MM_SS);
|
||||
Map<String, Object> paramsMap = new HashMap<>();
|
||||
paramsMap.put("StartDate", startTime);
|
||||
paramsMap.put("EndDate", endTime);
|
||||
KeyInfo keyInfo = betRecordByTimeDTO.getKeyInfo();
|
||||
String currency = keyInfo.getCurrency();
|
||||
String targetCurrency = platform.getCurrencyInfo().get(currency);
|
||||
if (StringUtils.isEmpty(targetCurrency)) {
|
||||
log.error("获取不到币种,platformCode:{},{}->{}", platform.getPlatformCode(), currency, targetCurrency);
|
||||
//continue;
|
||||
return Boolean.FALSE;
|
||||
}
|
||||
String startTime = DateUtils.convertTimeZone(betRecordByTimeDTO.getStartTime(), "America/New_York", DateUtils.YYYY_MM_DD_HH_MM_SS);
|
||||
String endTime = DateUtils.convertTimeZone(betRecordByTimeDTO.getEndTime(), "America/New_York", DateUtils.YYYY_MM_DD_HH_MM_SS);
|
||||
Map<String, Object> paramsMap = new HashMap<>();
|
||||
paramsMap.put("StartDate", startTime);
|
||||
paramsMap.put("EndDate", endTime);
|
||||
KeyInfo keyInfo = betRecordByTimeDTO.getKeyInfo();
|
||||
String currency = keyInfo.getCurrency();
|
||||
String targetCurrency = platform.getCurrencyInfo().get(currency);
|
||||
if (StringUtils.isEmpty(targetCurrency)) {
|
||||
log.error("获取不到币种,platformCode:{},{}->{}", platform.getPlatformCode(), currency, targetCurrency);
|
||||
return Boolean.FALSE;
|
||||
}
|
||||
|
||||
paramsMap.putAll(getKeyMap(paramsMap, betRecordByTimeDTO.getAgentKey(), keyInfo.getCurrency(), betRecordByTimeDTO.getAgentId()));
|
||||
paramsMap.putAll(getKeyMap(paramsMap, betRecordByTimeDTO.getAgentKey(), keyInfo.getCurrency(), betRecordByTimeDTO.getAgentId()));
|
||||
|
||||
ApiFCBetRecordResponseDTO betRecordByTime = FCClient.getBetRecordByTime(paramsMap);
|
||||
ApiFCBetRecordResponseDTO betRecordByTime = FCClient.getBetRecordByTime(paramsMap);
|
||||
|
||||
if (this.getIsSuccess(betRecordByTime.getResult())) {
|
||||
//数据组装
|
||||
this.batchInsert(betRecordByTime, currency, targetCurrency);
|
||||
}
|
||||
//}
|
||||
if (this.getIsSuccess(betRecordByTime.getResult())) {
|
||||
//数据组装
|
||||
this.batchInsert(betRecordByTime, currency, targetCurrency);
|
||||
}
|
||||
return Boolean.TRUE;
|
||||
}
|
||||
|
||||
|
|
@ -476,7 +463,7 @@ public class GamesFCServiceImpl implements IGamesService {
|
|||
Platform platform = betRecordByTimeDTO.getVendor();
|
||||
for (KeyInfo keyInfo : platform.getKeyInfo()) {
|
||||
|
||||
// for (GameSecretKeyCurrency gameSecretKeyCurrency : gameSecretKeyCurrencies) {
|
||||
|
||||
//必须两个小时之前的数据
|
||||
long startTimeLong = DateUtils.addOrSubtractMinutes(betRecordByTimeDTO.getStartTime(), -120);
|
||||
long endTimeLong = DateUtils.addOrSubtractMinutes(betRecordByTimeDTO.getEndTime(), -120);
|
||||
|
|
|
|||
|
|
@ -24,7 +24,7 @@ public class MyJILIAddressSource implements AddressSource {
|
|||
|
||||
@Override
|
||||
public ForestAddress getAddress(ForestRequest request) {
|
||||
String apiBaseUrl = platformService.get(GamePlatforms.FC.getCode())
|
||||
String apiBaseUrl = platformService.get(GamePlatforms.JILI.getCode())
|
||||
.getUrlInfo().getUrl();
|
||||
return new ForestAddress("https", apiBaseUrl, 443, "api1");
|
||||
}
|
||||
|
|
|
|||
|
|
@ -63,6 +63,22 @@ public interface JILIClient {
|
|||
)
|
||||
JILIExchangeMoneyResponseDTO exchangeTransferByAgentId(@Var("parameters") String parameters,@Body("AgentId") String agentId);
|
||||
|
||||
/**
|
||||
* 按交易id检查转账
|
||||
*
|
||||
* @param parameters 范围
|
||||
* @param agentId 代理id
|
||||
* @return {@link JILITransferStatusResponseDTO }
|
||||
*/
|
||||
@Post(
|
||||
url = "/CheckTransferByTransactionId?${parameters}",
|
||||
headers = {
|
||||
"Content-type: application/x-www-form-urlencoded"
|
||||
}
|
||||
)
|
||||
JILITransferStatusResponseDTO checkTransferByTransactionId(@Var("parameters") String parameters,@Body("AgentId") String agentId);
|
||||
|
||||
|
||||
/**
|
||||
* 按时间获取投注记录
|
||||
*
|
||||
|
|
|
|||
|
|
@ -22,7 +22,7 @@ public class JILIGamesDataDTO {
|
|||
/**
|
||||
*自己系统游戏id
|
||||
*/
|
||||
private Long systemGameId;
|
||||
private String systemGameId;
|
||||
|
||||
/**
|
||||
* 名称
|
||||
|
|
|
|||
|
|
@ -0,0 +1,78 @@
|
|||
package com.ff.game.api.jili.dto;
|
||||
|
||||
import com.fasterxml.jackson.annotation.JsonProperty;
|
||||
import lombok.Data;
|
||||
|
||||
import java.math.BigDecimal;
|
||||
|
||||
/**
|
||||
* jilitransfer状态响应数据
|
||||
*
|
||||
* @author shi
|
||||
* @date 2025/04/08
|
||||
*/
|
||||
@Data
|
||||
public class JILITransferStatusResponseDTO {
|
||||
|
||||
|
||||
/**
|
||||
* 错误代码,0 表示成功
|
||||
*/
|
||||
@JsonProperty("ErrorCode")
|
||||
private int errorCode;
|
||||
|
||||
/**
|
||||
* 错误或状态信息
|
||||
*/
|
||||
@JsonProperty("Message")
|
||||
private String message;
|
||||
|
||||
/**
|
||||
* 转账相关数据
|
||||
*/
|
||||
@JsonProperty("Data")
|
||||
private TransferData data;
|
||||
|
||||
/**
|
||||
* 转账详细数据结构
|
||||
*/
|
||||
@Data
|
||||
public static class TransferData {
|
||||
|
||||
/**
|
||||
* 用户账户名
|
||||
*/
|
||||
@JsonProperty("Account")
|
||||
private String account;
|
||||
|
||||
/**
|
||||
* 转账交易 ID
|
||||
*/
|
||||
@JsonProperty("TransactionId")
|
||||
private String transactionId;
|
||||
|
||||
/**
|
||||
* 转账时间,格式为 ISO 8601,如:2023-03-13T01:13:59-04:00
|
||||
*/
|
||||
@JsonProperty("TransferTime")
|
||||
private String transferTime;
|
||||
|
||||
/**
|
||||
* 转账金额
|
||||
*/
|
||||
@JsonProperty("Amount")
|
||||
private BigDecimal amount;
|
||||
|
||||
/**
|
||||
* 转账状态,1 表示成功,其他值可表示失败等状态
|
||||
*/
|
||||
@JsonProperty("Status")
|
||||
private int status;
|
||||
|
||||
/**
|
||||
* 转账类型,例如 1 表示入账,2 表示出账(视接口定义而定)
|
||||
*/
|
||||
@JsonProperty("TransferType")
|
||||
private int transferType;
|
||||
}
|
||||
}
|
||||
|
|
@ -15,6 +15,7 @@ import com.ff.base.utils.sign.Md5Utils;
|
|||
import com.ff.base.utils.uuid.IdUtils;
|
||||
import com.ff.config.KeyConfig;
|
||||
import com.ff.game.api.IGamesService;
|
||||
import com.ff.game.api.fc.dto.ApiCFBalanceTransferStatusResponseDTO;
|
||||
import com.ff.game.api.jili.client.JILIClient;
|
||||
import com.ff.game.api.jili.dto.*;
|
||||
import com.ff.game.api.request.*;
|
||||
|
|
@ -226,23 +227,8 @@ public class GamesJILIServiceImpl implements IGamesService {
|
|||
if (this.getIsSuccess(jiliGames.getErrorCode())) {
|
||||
|
||||
for (JILIGamesDataDTO gamesDataDTO : jiliGames.getData()) {
|
||||
/*GamePlatform gamePlatform = GamePlatform.builder()
|
||||
.platformType(JILIGameType.findSystemByCode(gamesDataDTO.getGameCategoryId()))
|
||||
.platformCode(GamePlatforms.JILI.getInfo())
|
||||
.build();
|
||||
List<GamePlatform> gamePlatforms = gamePlatformService.selectGamePlatformList(gamePlatform);
|
||||
//没有此平台就新增一个平台
|
||||
if (CollectionUtils.isEmpty(gamePlatforms)) {
|
||||
gamePlatform.setPlatformName(GamePlatforms.JILI.getInfo() + JILIGameType.findInfoByCode(gamesDataDTO.getGameCategoryId()));
|
||||
gamePlatform.setSortNo(gamePlatformService.selectMaxSortNo() + 1);
|
||||
gamePlatform.setCreateBy(Constants.SYSTEM);
|
||||
gamePlatformService.insertGamePlatform(gamePlatform);
|
||||
} else {
|
||||
gamePlatform = gamePlatforms.get(0);
|
||||
}*/
|
||||
Integer platformType = JILIGameType.findSystemByCode(gamesDataDTO.getGameCategoryId());
|
||||
Game game = Game.builder()
|
||||
//.platformId(gamePlatform.getId())
|
||||
.platformCode(GamePlatforms.JILI.getCode())
|
||||
.platformType(platformType)
|
||||
.gameCode(String.valueOf(gamesDataDTO.getGameId()))
|
||||
|
|
@ -257,7 +243,7 @@ public class GamesJILIServiceImpl implements IGamesService {
|
|||
game.setCreateBy(Constants.SYSTEM);
|
||||
game.setPlatformType(platformType);
|
||||
game.setPlatformCode(GamePlatforms.JILI.getCode());
|
||||
|
||||
game.setGameId(StringUtils.addSuffix(GamePlatforms.JILI.getCode(), gamesDataDTO.getGameId()));
|
||||
List<NameInfo> nameInfos = new ArrayList<>();
|
||||
nameInfos.add(new NameInfo(gamesDataDTO.getName().getZhCN(), "zh-CN"));
|
||||
nameInfos.add(new NameInfo(gamesDataDTO.getName().getEnUS(), "en-US"));
|
||||
|
|
@ -266,29 +252,13 @@ public class GamesJILIServiceImpl implements IGamesService {
|
|||
gameService.insertGame(game);
|
||||
} else {
|
||||
game = games.get(0);
|
||||
List<NameInfo> nameInfos = new ArrayList<>();
|
||||
nameInfos.add(new NameInfo(gamesDataDTO.getName().getZhCN(), "zh-CN"));
|
||||
nameInfos.add(new NameInfo(gamesDataDTO.getName().getEnUS(), "en-US"));
|
||||
game.setNameInfo(nameInfos);
|
||||
gameService.updateGame(game);
|
||||
}
|
||||
gamesDataDTO.setSystemGameId(game.getId());
|
||||
|
||||
|
||||
/*List<GameName> gameNames = gameNameService.selectGameNameList(GameName
|
||||
.builder()
|
||||
.gameId(game.getId())
|
||||
.gameName(game.getGameName()).build());
|
||||
if (CollectionUtils.isEmpty(gameNames)) {
|
||||
gameNameService.insertGameName(GameName.builder()
|
||||
.gameId(game.getId())
|
||||
.gameName(game.getGameName())
|
||||
.langCode("zh-CN")
|
||||
.createBy(Constants.SYSTEM)
|
||||
.build());
|
||||
|
||||
gameNameService.insertGameName(GameName.builder()
|
||||
.gameId(game.getId())
|
||||
.gameName(gamesDataDTO.getName().getEnUS())
|
||||
.langCode("en-US")
|
||||
.createBy(Constants.SYSTEM)
|
||||
.build());
|
||||
}*/
|
||||
gamesDataDTO.setSystemGameId(game.getGameId());
|
||||
|
||||
|
||||
}
|
||||
|
|
@ -304,6 +274,17 @@ public class GamesJILIServiceImpl implements IGamesService {
|
|||
return CacheConstants.JILI_GAMES;
|
||||
}
|
||||
|
||||
/**
|
||||
* 获取交易id
|
||||
*
|
||||
* @param transactionIdRequestDTO 事务id请求dto
|
||||
* @return {@link String }
|
||||
*/
|
||||
@Override
|
||||
public String getTransactionId(TransactionIdRequestDTO transactionIdRequestDTO) {
|
||||
return GamePlatforms.JILI.getInfo() + IdUtils.simpleUUID();
|
||||
}
|
||||
|
||||
/**
|
||||
* 按代理id进行交换转账
|
||||
*
|
||||
|
|
@ -313,38 +294,14 @@ public class GamesJILIServiceImpl implements IGamesService {
|
|||
@Override
|
||||
@Transactional
|
||||
public Long exchangeTransferByAgentId(ExchangeTransferMoneyRequestDTO exchangeTransferMoneyRequestDTO) {
|
||||
// GameSecretKeyCurrencyDTO gameSecretKey = gameSecretKeyCurrencyService.findByGameSecretKeyCurrencyDTO(GameSecretKeyCurrencyDTO.builder()
|
||||
// .code(exchangeTransferMoneyRequestDTO.getAgentId())
|
||||
// .currency(exchangeTransferMoneyRequestDTO.getCurrency()).build());
|
||||
|
||||
Member member = memberService.selectMemberByGameAccount(exchangeTransferMoneyRequestDTO.getAccount());
|
||||
String transactionId = GamePlatforms.JILI.getInfo() + IdUtils.simpleUUID();
|
||||
|
||||
List<GameExchangeMoney> gameExchangeMonies = gameExchangeMoneyService.selectGameExchangeMoneyList(
|
||||
GameExchangeMoney.builder()
|
||||
.tenantKey(exchangeTransferMoneyRequestDTO.getTenantKey())
|
||||
.orderId(exchangeTransferMoneyRequestDTO.getOrderId())
|
||||
.build()
|
||||
);
|
||||
Assert.isTrue(CollectionUtils.isEmpty(gameExchangeMonies), "订单号重复");
|
||||
GameExchangeMoney exchangeMoney = gameExchangeMoneyService.selectGameExchangeMoneyById(exchangeTransferMoneyRequestDTO.getGameExchangeId());
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
//获取下一个自增id
|
||||
GameExchangeMoney exchangeMoney = GameExchangeMoney
|
||||
.builder()
|
||||
.orderId(exchangeTransferMoneyRequestDTO.getOrderId())
|
||||
.tenantKey(exchangeTransferMoneyRequestDTO.getTenantKey())
|
||||
.quota(exchangeTransferMoneyRequestDTO.getQuota())
|
||||
.balance(exchangeTransferMoneyRequestDTO.getAmount())
|
||||
.exchangeType(exchangeTransferMoneyRequestDTO.getTransferType())
|
||||
.currencyCode(exchangeTransferMoneyRequestDTO.getSystemCurrency())
|
||||
.memberId(member.getId())
|
||||
.transactionId(transactionId)
|
||||
.platformCode(GamePlatforms.JILI.getInfo())
|
||||
.build();
|
||||
exchangeMoney.setCreateBy(Constants.SYSTEM);
|
||||
//接口限制限制50字符
|
||||
exchangeMoney.setTransactionId(transactionId);
|
||||
String query = "Account=" + exchangeTransferMoneyRequestDTO.getAccount()
|
||||
+ "&TransactionId=" + exchangeMoney.getTransactionId()
|
||||
+ "&Amount=" + exchangeTransferMoneyRequestDTO.getAmount()
|
||||
|
|
@ -371,10 +328,14 @@ public class GamesJILIServiceImpl implements IGamesService {
|
|||
exchangeMoney.setCoinAfter(exchangeMoneyResponseData.getCoinAfter());
|
||||
exchangeMoney.setCurrencyBefore(exchangeMoneyResponseData.getCurrencyBefore());
|
||||
exchangeMoney.setCurrencyAfter(exchangeMoneyResponseData.getCurrencyAfter());
|
||||
exchangeMoney.setStatus(exchangeMoneyResponseData.getStatus());
|
||||
gameExchangeMoneyService.insertGameExchangeMoney(exchangeMoney);
|
||||
exchangeMoney.setStep(GameExchangeStep.PLATFORM_TRANSACTION.getCode());
|
||||
exchangeMoney.setStepStatus(GameExchangeStepStatus.SUCCESS.getCode());
|
||||
gameExchangeMoneyService.updateGameExchangeMoney(exchangeMoney);
|
||||
|
||||
} else {
|
||||
exchangeMoney.setStep(GameExchangeStep.PLATFORM_TRANSACTION.getCode());
|
||||
exchangeMoney.setStepStatus(GameExchangeStepStatus.FAILURE.getCode());
|
||||
gameExchangeMoneyService.updateGameExchangeMoney(exchangeMoney);
|
||||
throw new BaseException(exchangeMoneyResponse.getMessage());
|
||||
}
|
||||
|
||||
|
|
@ -389,8 +350,32 @@ public class GamesJILIServiceImpl implements IGamesService {
|
|||
* @return {@link Boolean }
|
||||
*/
|
||||
@Override
|
||||
public Boolean exchangeTransferStatus(ExchangeTransferStatusRequestDTO exchangeTransferMoneyRequestDTO) {
|
||||
return Boolean.TRUE;
|
||||
public ExchangeTransferStatusResponseDTO exchangeTransferStatus(ExchangeTransferStatusRequestDTO exchangeTransferMoneyRequestDTO) {
|
||||
log.info("GamesDGServiceImpl [exchangeTransferStatus] 请求参数 {}", exchangeTransferMoneyRequestDTO);
|
||||
|
||||
String query = "TransactionId=" + exchangeTransferMoneyRequestDTO.getOrderId()
|
||||
+ "&AgentId=" + exchangeTransferMoneyRequestDTO.getAgentId();
|
||||
exchangeTransferMoneyRequestDTO.setQuery(query);
|
||||
|
||||
String key = this.getKey(exchangeTransferMoneyRequestDTO);
|
||||
|
||||
JILITransferStatusResponseDTO jiliTransferStatusResponseDTO = jiliClient.checkTransferByTransactionId(query + "&Key=" + key, exchangeTransferMoneyRequestDTO.getAgentId());
|
||||
Integer status = StatusType.IN_PROGRESS.getValue();
|
||||
if (this.getIsSuccess(jiliTransferStatusResponseDTO.getErrorCode())) {
|
||||
status = StatusType.SUCCESS.getValue();
|
||||
} else {
|
||||
status = StatusType.FAILURE.getValue();
|
||||
}
|
||||
JILITransferStatusResponseDTO.TransferData data = jiliTransferStatusResponseDTO.getData();
|
||||
ExchangeTransferStatusResponseDTO statusResponseDTO = ExchangeTransferStatusResponseDTO.builder()
|
||||
.statusType(status)
|
||||
.build();
|
||||
if (!ObjectUtils.isEmpty(data)) {
|
||||
|
||||
statusResponseDTO.setBalance(data.getAmount());
|
||||
}
|
||||
|
||||
return statusResponseDTO;
|
||||
}
|
||||
|
||||
|
||||
|
|
@ -452,7 +437,45 @@ public class GamesJILIServiceImpl implements IGamesService {
|
|||
*/
|
||||
@Override
|
||||
public Boolean getBetRecordByHistoryTime(BetRecordByTimeDTO betRecordByTimeDTO) {
|
||||
return null;
|
||||
String startTime = DateUtils.formatDateToGMT4(new Date(betRecordByTimeDTO.getStartTime()));
|
||||
String endTime = DateUtils.formatDateToGMT4(new Date(betRecordByTimeDTO.getEndTime()));
|
||||
|
||||
//请求参数
|
||||
String query = "StartTime=" + startTime + "&EndTime=" + endTime + "&Page=" + betRecordByTimeDTO.getPage() + "&PageLimit=" + betRecordByTimeDTO.getPageLimit() + "&AgentId=" + betRecordByTimeDTO.getAgentId();
|
||||
log.info("GamesJILIServiceImpl [getBetRecordByHistoryTime] 请求参数 {}", query);
|
||||
betRecordByTimeDTO.setQuery(query);
|
||||
//获取key
|
||||
String key = this.getKey(betRecordByTimeDTO);
|
||||
JILIBetRecordResponseDTO betRecordJILIResponse = jiliClient.getBetRecordByTime(query + "&Key=" + key, betRecordByTimeDTO.getAgentId());
|
||||
|
||||
//判断是否获取成功
|
||||
if (this.getIsSuccess(betRecordJILIResponse.getErrorCode())) {
|
||||
|
||||
//数据插入
|
||||
this.batchInsert(betRecordJILIResponse, betRecordByTimeDTO);
|
||||
JILIBetRecordResponseDTO.DataBean dataBean = betRecordJILIResponse.getData();
|
||||
//获取下一页数据
|
||||
while (dataBean.getPagination().getCurrentPage() != dataBean.getPagination().getTotalPages() && dataBean.getPagination().getTotalPages() > 0) {
|
||||
betRecordByTimeDTO.setPage(dataBean.getPagination().getCurrentPage() + 1);
|
||||
//请求参数
|
||||
query = "StartTime=" + startTime + "&EndTime=" + endTime + "&Page=" + betRecordByTimeDTO.getPage() + "&PageLimit=" + betRecordByTimeDTO.getPageLimit() + "&AgentId=" + betRecordByTimeDTO.getAgentId();
|
||||
log.info("GamesJILIServiceImpl [getBetRecordByHistoryTime] 请求参数 {}", query);
|
||||
betRecordByTimeDTO.setQuery(query);
|
||||
key = this.getKey(betRecordByTimeDTO);
|
||||
betRecordJILIResponse = jiliClient.getBetRecordByTime(query + "&Key=" + key, betRecordByTimeDTO.getAgentId());
|
||||
dataBean = betRecordJILIResponse.getData();
|
||||
if (this.getIsSuccess(betRecordJILIResponse.getErrorCode())) {
|
||||
//数据插入
|
||||
this.batchInsert(betRecordJILIResponse, betRecordByTimeDTO);
|
||||
} else {
|
||||
log.error("GameBettingDataJILIServiceImpl [getBetRecordByHistoryTime] 获取投注记录失败,错误代码{},错误信息{}", betRecordJILIResponse.getErrorCode(), betRecordJILIResponse.getMessage());
|
||||
}
|
||||
}
|
||||
} else {
|
||||
log.error("GameBettingDataJILIServiceImpl [getBetRecordByHistoryTime] 获取投注记录失败,错误代码{},错误信息{}", betRecordJILIResponse.getErrorCode(), betRecordJILIResponse.getMessage());
|
||||
return Boolean.FALSE;
|
||||
}
|
||||
return Boolean.TRUE;
|
||||
}
|
||||
|
||||
|
||||
|
|
@ -467,9 +490,6 @@ public class GamesJILIServiceImpl implements IGamesService {
|
|||
|
||||
String freeSpinValidity = DateUtils.formatDateToGMT4(new Date(createFreeSpinRequest.getFreeSpinValidity()));
|
||||
|
||||
// GameSecretKeyCurrencyDTO gameSecretKey = gameSecretKeyCurrencyService.findByGameSecretKeyCurrencyDTO(GameSecretKeyCurrencyDTO.builder()
|
||||
// .code(createFreeSpinRequest.getAgentId())
|
||||
// .currency(createFreeSpinRequest.getCurrency()).build());
|
||||
|
||||
List<Long> gameIds = createFreeSpinRequest.getGameIds();
|
||||
GameUniqueDTO gameUniqueDTO = new GameUniqueDTO();
|
||||
|
|
@ -678,7 +698,6 @@ public class GamesJILIServiceImpl implements IGamesService {
|
|||
//请求参数
|
||||
String query = "ReferenceId=" + cancelFreeSpinRequestDTO.getReferenceId()
|
||||
+ "&AgentId=" + cancelFreeSpinRequestDTO.getAgentId();
|
||||
;
|
||||
log.info("GamesJILIServiceImpl [cancelFreeSpin] 请求参数 {}", query);
|
||||
cancelFreeSpinRequestDTO.setQuery(query);
|
||||
//获取key
|
||||
|
|
@ -717,7 +736,7 @@ public class GamesJILIServiceImpl implements IGamesService {
|
|||
* @param betRecordJILIResponse 投注记录jiliresponse
|
||||
* @return {@link Integer }
|
||||
*/
|
||||
private void batchInsert(JILIBetRecordResponseDTO betRecordJILIResponse, BetRecordByTimeDTO betRecordByTimeDTO) {
|
||||
private synchronized void batchInsert(JILIBetRecordResponseDTO betRecordJILIResponse, BetRecordByTimeDTO betRecordByTimeDTO) {
|
||||
List<GameBettingDetails> gameBettingDetails = new ArrayList<>();
|
||||
List<String> wagersIds = new ArrayList<>();
|
||||
//数据组装
|
||||
|
|
@ -761,10 +780,6 @@ public class GamesJILIServiceImpl implements IGamesService {
|
|||
|
||||
//转化类
|
||||
JILIBetRecordDataResponseDTO jiliBetRecordDataResponseDTO = (JILIBetRecordDataResponseDTO) gamesDataBuildDTO.getData();
|
||||
// GameSecretKeyCurrencyDTO gameSecretKey = gameSecretKeyCurrencyService.findByGameSecretKeyCurrencyDTO(GameSecretKeyCurrencyDTO.builder()
|
||||
// .code(jiliBetRecordDataResponseDTO.getAgentId())
|
||||
// .platformCode(GamePlatforms.JILI.getInfo()).build());
|
||||
|
||||
|
||||
Member member = memberService.selectMemberByGameAccount(jiliBetRecordDataResponseDTO.getAccount());
|
||||
if (ObjectUtils.isEmpty(member)) {
|
||||
|
|
@ -789,7 +804,7 @@ public class GamesJILIServiceImpl implements IGamesService {
|
|||
.gameCode(jiliBetRecordDataResponseDTO.getGameId())
|
||||
.gameType(JILIGameType.findSystemByCode(jiliBetRecordDataResponseDTO.getGameCategoryId()))
|
||||
.platformCode(GamePlatforms.JILI.getInfo())
|
||||
.gameId(gamesDataDTO.getSystemGameId())
|
||||
.gameId(/*gamesDataDTO.getSystemGameId()*/gamesDataDTO.getSystemGameId())
|
||||
.gameName(gamesDataDTO.getName().getZhCN())
|
||||
.gameStatus(jiliBetRecordDataResponseDTO.getStatus())
|
||||
.gameStatusType(jiliBetRecordDataResponseDTO.getType())
|
||||
|
|
|
|||
|
|
@ -2,13 +2,11 @@ package com.ff.game.api.km.client;
|
|||
|
||||
|
||||
import com.dtflys.forest.annotation.*;
|
||||
import com.ff.game.api.dg.dto.DGBetRecordResponseDTO;
|
||||
import com.ff.game.api.dg.dto.DGResponse;
|
||||
import com.ff.game.api.dg.dto.DGUserListResponseDTO;
|
||||
import com.ff.game.api.fc.dto.ApiCFBalanceTransferStatusResponseDTO;
|
||||
import com.ff.game.api.km.address.MyKMAddressSource;
|
||||
import com.ff.game.api.km.dto.*;
|
||||
import com.ff.game.api.km.success.MyKMSuccessCondition;
|
||||
import com.ff.game.api.xk.dto.XKBetRecordResponseDTO;
|
||||
import com.ff.game.api.success.MySuccessCondition;
|
||||
|
||||
import java.util.Map;
|
||||
|
||||
|
|
@ -19,7 +17,7 @@ import java.util.Map;
|
|||
* @date 2025/02/10
|
||||
*/
|
||||
@Address(source = MyKMAddressSource.class)
|
||||
@Success(condition = MyKMSuccessCondition.class)
|
||||
@Success(condition = MySuccessCondition.class)
|
||||
public interface KMClient {
|
||||
/**
|
||||
* 创建成员
|
||||
|
|
@ -81,6 +79,16 @@ public interface KMClient {
|
|||
@Get(url ="/v2/history/bets?{params}")
|
||||
KMBetRecordResponse getBetRecordByTime(@Var("params")String params, @Header Map<String, Object> header);
|
||||
|
||||
/**
|
||||
* 汇兑转移状态
|
||||
*
|
||||
* @param params 参数
|
||||
* @param parameters 范围
|
||||
* @return {@link KMBalanceTransferStatusResponseDTO }
|
||||
*/
|
||||
@Post(url = "/history/transfers/{params}")
|
||||
KMBalanceTransferStatusResponseDTO exchangeTransferStatus(@Var("params")String params,@JSONBody Map<String, Object> parameters);
|
||||
|
||||
|
||||
/**
|
||||
* 踢腿队员
|
||||
|
|
|
|||
|
|
@ -0,0 +1,77 @@
|
|||
package com.ff.game.api.km.dto;
|
||||
|
||||
|
||||
import com.fasterxml.jackson.annotation.JsonProperty;
|
||||
import lombok.Data;
|
||||
|
||||
import java.math.BigDecimal;
|
||||
|
||||
/**
|
||||
* km平衡传输状态响应数据
|
||||
*
|
||||
* @author shi
|
||||
* @date 2025/04/08
|
||||
*/
|
||||
@Data
|
||||
public class KMBalanceTransferStatusResponseDTO {
|
||||
|
||||
/**
|
||||
* 错误代码
|
||||
*/
|
||||
@JsonProperty("err")
|
||||
private Integer errorCode;
|
||||
|
||||
/**
|
||||
* 错误描述
|
||||
*/
|
||||
@JsonProperty("errdesc")
|
||||
private String errorDescription;
|
||||
|
||||
/**
|
||||
* 转账交易 ID
|
||||
*/
|
||||
@JsonProperty("txid")
|
||||
private String txid;
|
||||
|
||||
/**
|
||||
* 转账时间戳,格式为 ISO 8601,如:2017-12-12T12:11:16+08:00
|
||||
*/
|
||||
@JsonProperty("timestamp")
|
||||
private String timestamp;
|
||||
|
||||
/**
|
||||
* 用户 ID
|
||||
*/
|
||||
@JsonProperty("userid")
|
||||
private String userid;
|
||||
|
||||
/**
|
||||
* 用户名
|
||||
*/
|
||||
@JsonProperty("username")
|
||||
private String username;
|
||||
|
||||
/**
|
||||
* 玩家类型,1 代表普通玩家(具体含义根据接口文档定义)
|
||||
*/
|
||||
@JsonProperty("playertype")
|
||||
private int playertype;
|
||||
|
||||
/**
|
||||
* 转账金额
|
||||
*/
|
||||
@JsonProperty("amt")
|
||||
private BigDecimal amt;
|
||||
|
||||
/**
|
||||
* 转账后的余额
|
||||
*/
|
||||
@JsonProperty("postbal")
|
||||
private BigDecimal postbal;
|
||||
|
||||
/**
|
||||
* 货币类型,符合 ISO 4217 标准(如 THB)
|
||||
*/
|
||||
@JsonProperty("cur")
|
||||
private String cur;
|
||||
}
|
||||
|
|
@ -91,7 +91,7 @@ public class KMGameResponse {
|
|||
/**
|
||||
* 系统游戏id
|
||||
*/
|
||||
private Long systemGameId;
|
||||
private String systemGameId;
|
||||
|
||||
/**
|
||||
* 游戏是否提供试玩
|
||||
|
|
|
|||
|
|
@ -15,6 +15,8 @@ import com.ff.base.utils.ip.IpUtils;
|
|||
import com.ff.base.utils.uuid.IdUtils;
|
||||
import com.ff.config.KeyConfig;
|
||||
import com.ff.game.api.IGamesService;
|
||||
import com.ff.game.api.fc.dto.ApiCFBalanceTransferStatusResponseDTO;
|
||||
import com.ff.game.api.jili.dto.JILITransferStatusResponseDTO;
|
||||
import com.ff.game.api.km.client.KMClient;
|
||||
import com.ff.game.api.km.dto.*;
|
||||
import com.ff.game.api.request.*;
|
||||
|
|
@ -78,21 +80,6 @@ public class GamesKMServiceImpl implements IGamesService {
|
|||
private IGameBettingDetailsService gameBettingDetailsService;
|
||||
|
||||
|
||||
/**
|
||||
* 游戏id
|
||||
*/
|
||||
private static final Long GAME_ID = 1904452832756003817L;
|
||||
|
||||
/**
|
||||
* 平台ID
|
||||
*/
|
||||
private static final Long PLATFORM_ID = 1904411420157108325L;
|
||||
|
||||
/**
|
||||
* 游戏名称id
|
||||
*/
|
||||
private static final Long GAME_NAME_ID = 1904452832756002317L;
|
||||
|
||||
/**
|
||||
* 获得就是成功
|
||||
*
|
||||
|
|
@ -168,11 +155,7 @@ public class GamesKMServiceImpl implements IGamesService {
|
|||
public MemberInfoResponseDTO getMemberInfo(MemberInfoRequestDTO memberInfoRequestDTO) {
|
||||
log.info("GamesDGServiceImpl [getMemberInfo] 请求参数 {}", memberInfoRequestDTO);
|
||||
Map<String, Object> paramsMap = new HashMap<>();
|
||||
// Member member = memberService.selectMemberByGameAccount(memberInfoRequestDTO.getAccounts());
|
||||
// GameSecretKeyCurrency currencyDTO = gameSecretKeyCurrencyService.findByGameSecretKeyCurrencyDTO(GameSecretKeyCurrencyDTO.builder()
|
||||
// .platformCode(GamePlatforms.KM.getInfo())
|
||||
// .currency(member.getCurrencyCode())
|
||||
// .build());
|
||||
|
||||
|
||||
paramsMap.put("userid", memberInfoRequestDTO.getAccounts());
|
||||
paramsMap.put("cur", memberInfoRequestDTO.getCurrency());
|
||||
|
|
@ -196,11 +179,7 @@ public class GamesKMServiceImpl implements IGamesService {
|
|||
log.info("GamesKMServiceImpl [loginWithoutRedirect] 请求参数 {}", gamesLogin);
|
||||
String kmUserToken = redisCache.getCacheObject(CacheConstants.KM_USER_TOKEN + gamesLogin.getAccount());
|
||||
if (StringUtils.isEmpty(kmUserToken)) {
|
||||
// Member member = memberService.selectMemberByGameAccount(gamesLogin.getAccount());
|
||||
// GameSecretKeyCurrency currencyDTO = gameSecretKeyCurrencyService.findByGameSecretKeyCurrencyDTO(GameSecretKeyCurrencyDTO.builder()
|
||||
// .platformCode(GamePlatforms.KM.getInfo())
|
||||
// .currency(member.getCurrencyCode())
|
||||
// .build());
|
||||
|
||||
|
||||
CreateMemberRequestDTO gamesBaseRequestDTO = CreateMemberRequestDTO.builder()
|
||||
.account(gamesLogin.getAccount())
|
||||
|
|
@ -213,7 +192,6 @@ public class GamesKMServiceImpl implements IGamesService {
|
|||
}
|
||||
|
||||
String loginUrl = platformService.get(GamePlatforms.KM.getCode()).getUrlInfo().getLoginUrl();
|
||||
//String selectConfigByKey = configService.selectConfigByKey(Constants.KM_API_BASE_LOGIN_URL);
|
||||
|
||||
return loginUrl + "/gamelauncher?gpcode=" + gamesLogin.getGameType()
|
||||
+ "&gcode=" + gamesLogin.getGameId()
|
||||
|
|
@ -269,23 +247,9 @@ public class GamesKMServiceImpl implements IGamesService {
|
|||
.anyMatch(pc -> pc.getCode().equals(mobile.getCode())))
|
||||
.collect(Collectors.toList());
|
||||
for (KMGameResponse.Game game : games) {
|
||||
// GamePlatform gamePlatform = GamePlatform.builder()
|
||||
// .platformType(KMGameType.findSystemByCode(game.getProviderCode()))
|
||||
// .platformCode(GamePlatforms.KM.getCode())
|
||||
// .build();
|
||||
/*List<GamePlatform> gamePlatforms = gamePlatformService.selectGamePlatformList(gamePlatform);
|
||||
//没有此平台就新增一个平台
|
||||
if (CollectionUtils.isEmpty(gamePlatforms)) {
|
||||
gamePlatform.setPlatformName(GamePlatforms.KM.getInfo() + KMGameType.findInfoByCode(game.getProviderCode()));
|
||||
gamePlatform.setSortNo(gamePlatformService.selectMaxSortNo() + 1);
|
||||
gamePlatform.setCreateBy(Constants.SYSTEM);
|
||||
gamePlatformService.insertGamePlatform(gamePlatform);
|
||||
} else {
|
||||
gamePlatform = gamePlatforms.get(0);
|
||||
}*/
|
||||
|
||||
Integer platformType = KMGameType.findSystemByCode(game.getProviderCode());
|
||||
Game gameOne = Game.builder()
|
||||
//.platformId(gamePlatform.getId())
|
||||
.platformCode(GamePlatforms.KM.getCode())
|
||||
.platformType(platformType)
|
||||
.gameCode(game.getCode())
|
||||
|
|
@ -312,23 +276,8 @@ public class GamesKMServiceImpl implements IGamesService {
|
|||
*/
|
||||
private List<KMGameResponse.Game> gameList(KMGameResponse gameList, Integer ingress) {
|
||||
for (KMGameResponse.Game gamesDataDTO : gameList.getGames()) {
|
||||
// GamePlatform gamePlatform = GamePlatform.builder()
|
||||
// .platformType(KMGameType.findSystemByCode(gamesDataDTO.getProviderCode()))
|
||||
// .platformCode(GamePlatforms.KM.getCode())
|
||||
// .build();
|
||||
/*List<GamePlatform> gamePlatforms = gamePlatformService.selectGamePlatformList(gamePlatform);
|
||||
//没有此平台就新增一个平台
|
||||
if (CollectionUtils.isEmpty(gamePlatforms)) {
|
||||
gamePlatform.setPlatformName(GamePlatforms.KM.getInfo() + KMGameType.findInfoByCode(gamesDataDTO.getProviderCode()));
|
||||
gamePlatform.setSortNo(gamePlatformService.selectMaxSortNo() + 1);
|
||||
gamePlatform.setCreateBy(Constants.SYSTEM);
|
||||
gamePlatformService.insertGamePlatform(gamePlatform);
|
||||
} else {
|
||||
gamePlatform = gamePlatforms.get(0);
|
||||
}*/
|
||||
Integer platformType = KMGameType.findSystemByCode(gamesDataDTO.getProviderCode());
|
||||
Game game = Game.builder()
|
||||
//.platformId(gamePlatform.getId())
|
||||
.platformCode(GamePlatforms.KM.getCode())
|
||||
.platformType(platformType)
|
||||
.gameCode(gamesDataDTO.getCode())
|
||||
|
|
@ -345,28 +294,37 @@ public class GamesKMServiceImpl implements IGamesService {
|
|||
game.setIngress(ingress);
|
||||
game.setPlatformCode(GamePlatforms.KM.getCode());
|
||||
game.setPlatformType(platformType);
|
||||
game.setGameId(StringUtils.addSuffix(GamePlatforms.KM.getCode(), gamesDataDTO.getCode()));
|
||||
List<NameInfo> nameInfos = new ArrayList<>();
|
||||
nameInfos.add(new NameInfo(gamesDataDTO.getName(), "zh-CN"));
|
||||
game.setNameInfo(nameInfos);
|
||||
gameService.insertGame(game);
|
||||
} else {
|
||||
game = games.get(0);
|
||||
List<NameInfo> nameInfos = new ArrayList<>();
|
||||
nameInfos.add(new NameInfo(gamesDataDTO.getName(), "zh-CN"));
|
||||
game.setNameInfo(nameInfos);
|
||||
gameService.updateGame(game);
|
||||
}
|
||||
gamesDataDTO.setSystemGameId(game.getId());
|
||||
// List<GameName> gameNames = gameNameService.selectGameNameList(GameName.builder().gameId(game.getId()).gameName(game.getGameName()).build());
|
||||
// if (CollectionUtils.isEmpty(gameNames)) {
|
||||
// gameNameService.insertGameName(GameName.builder()
|
||||
// .gameId(game.getId())
|
||||
// .gameName(game.getGameName())
|
||||
// .langCode("zh-CN")
|
||||
// .createBy(Constants.SYSTEM)
|
||||
// .build());
|
||||
// }
|
||||
|
||||
gamesDataDTO.setSystemGameId(game.getGameId());
|
||||
}
|
||||
return gameList.getGames();
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* 获取交易id
|
||||
*
|
||||
* @param transactionIdRequestDTO 事务id请求dto
|
||||
* @return {@link String }
|
||||
*/
|
||||
@Override
|
||||
public String getTransactionId(TransactionIdRequestDTO transactionIdRequestDTO) {
|
||||
return GamePlatforms.KM.getInfo() + IdUtils.simpleUUID();
|
||||
}
|
||||
|
||||
|
||||
|
||||
/**
|
||||
* 按代理id进行交换转账
|
||||
*
|
||||
|
|
@ -377,41 +335,19 @@ public class GamesKMServiceImpl implements IGamesService {
|
|||
@Transactional
|
||||
public Long exchangeTransferByAgentId(ExchangeTransferMoneyRequestDTO exchangeTransferMoneyRequestDTO) {
|
||||
log.info("GamesKMServiceImpl [exchangeTransferByAgentId] 请求参数 {}", exchangeTransferMoneyRequestDTO);
|
||||
// GameSecretKeyCurrency currencyDTO = gameSecretKeyCurrencyService.findByGameSecretKeyCurrencyDTO(GameSecretKeyCurrencyDTO.builder()
|
||||
// .platformCode(GamePlatforms.KM.getInfo())
|
||||
// .currency(exchangeTransferMoneyRequestDTO.getCurrency())
|
||||
// .build());
|
||||
|
||||
Member member = memberService.selectMemberByGameAccount(exchangeTransferMoneyRequestDTO.getAccount());
|
||||
String transactionId = GamePlatforms.KM.getInfo() + IdUtils.simpleUUID();
|
||||
List<GameExchangeMoney> gameExchangeMonies = gameExchangeMoneyService.selectGameExchangeMoneyList(
|
||||
GameExchangeMoney.builder()
|
||||
.tenantKey(exchangeTransferMoneyRequestDTO.getTenantKey())
|
||||
.orderId(exchangeTransferMoneyRequestDTO.getOrderId())
|
||||
.build()
|
||||
);
|
||||
Assert.isTrue(CollectionUtils.isEmpty(gameExchangeMonies), "订单号重复");
|
||||
|
||||
//获取下一个自增id
|
||||
GameExchangeMoney exchangeMoney = GameExchangeMoney
|
||||
.builder()
|
||||
.tenantKey(exchangeTransferMoneyRequestDTO.getTenantKey())
|
||||
.orderId(exchangeTransferMoneyRequestDTO.getOrderId())
|
||||
.quota(exchangeTransferMoneyRequestDTO.getQuota())
|
||||
.balance(exchangeTransferMoneyRequestDTO.getAmount())
|
||||
.exchangeType(exchangeTransferMoneyRequestDTO.getTransferType())
|
||||
.currencyCode(exchangeTransferMoneyRequestDTO.getSystemCurrency())
|
||||
.memberId(member.getId())
|
||||
.transactionId(transactionId)
|
||||
.platformCode(GamePlatforms.KM.getInfo())
|
||||
.build();
|
||||
exchangeMoney.setCreateBy(Constants.SYSTEM);
|
||||
GameExchangeMoney exchangeMoney = gameExchangeMoneyService.selectGameExchangeMoneyById(exchangeTransferMoneyRequestDTO.getGameExchangeId());
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
BigDecimal amount = exchangeTransferMoneyRequestDTO.getAmount();
|
||||
if (TransferType.ALL.getCode().equals(exchangeTransferMoneyRequestDTO.getTransferType())) {
|
||||
// 获取第三方钱包余额
|
||||
MemberInfoRequestDTO gamesBaseRequestDTO = MemberInfoRequestDTO.builder()
|
||||
.accounts(member.getGameAccount())
|
||||
.accounts(exchangeTransferMoneyRequestDTO.getAccount())
|
||||
.agentId(exchangeTransferMoneyRequestDTO.getAgentId())
|
||||
.currency(exchangeTransferMoneyRequestDTO.getCurrency())
|
||||
.agentKey(exchangeTransferMoneyRequestDTO.getAgentKey())
|
||||
|
|
@ -424,7 +360,7 @@ public class GamesKMServiceImpl implements IGamesService {
|
|||
params.put("userid", exchangeTransferMoneyRequestDTO.getAccount());
|
||||
params.put("amt", amount);
|
||||
params.put("cur", exchangeTransferMoneyRequestDTO.getCurrency());
|
||||
params.put("txid", transactionId);
|
||||
params.put("txid", exchangeTransferMoneyRequestDTO.getTransactionId());
|
||||
|
||||
Map<String, Object> headerMap = this.getKey(exchangeTransferMoneyRequestDTO);
|
||||
KMTransactionResponse kmTransactionResponse;
|
||||
|
|
@ -443,9 +379,13 @@ public class GamesKMServiceImpl implements IGamesService {
|
|||
exchangeMoney.setCoinAfter(kmTransactionResponse.getBalance());
|
||||
exchangeMoney.setCurrencyBefore(exchangeMoney.getCoinBefore());
|
||||
exchangeMoney.setCurrencyAfter(exchangeMoney.getCoinAfter());
|
||||
exchangeMoney.setStatus(StatusType.SUCCESS.getValue());
|
||||
gameExchangeMoneyService.insertGameExchangeMoney(exchangeMoney);
|
||||
exchangeMoney.setStep(GameExchangeStep.PLATFORM_TRANSACTION.getCode());
|
||||
exchangeMoney.setStepStatus(GameExchangeStepStatus.SUCCESS.getCode());
|
||||
gameExchangeMoneyService.updateGameExchangeMoney(exchangeMoney);
|
||||
} else {
|
||||
exchangeMoney.setStep(GameExchangeStep.PLATFORM_TRANSACTION.getCode());
|
||||
exchangeMoney.setStepStatus(GameExchangeStepStatus.FAILURE.getCode());
|
||||
gameExchangeMoneyService.updateGameExchangeMoney(exchangeMoney);
|
||||
log.error("GamesDGServiceImpl [exchangeTransferByAgentId] 金额转移失败,错误代码{},错误信息{}", kmTransactionResponse.getErrorCode(), kmTransactionResponse.getErrorDescription());
|
||||
throw new ApiException(ErrorCode.BALANCE_TRANSFER_FAILED.getCode());
|
||||
}
|
||||
|
|
@ -460,8 +400,25 @@ public class GamesKMServiceImpl implements IGamesService {
|
|||
* @return {@link Boolean }
|
||||
*/
|
||||
@Override
|
||||
public Boolean exchangeTransferStatus(ExchangeTransferStatusRequestDTO exchangeTransferMoneyRequestDTO) {
|
||||
return Boolean.TRUE;
|
||||
public ExchangeTransferStatusResponseDTO exchangeTransferStatus(ExchangeTransferStatusRequestDTO exchangeTransferMoneyRequestDTO) {
|
||||
log.info("GamesKMServiceImpl [exchangeTransferStatus] 请求参数 {}", exchangeTransferMoneyRequestDTO);
|
||||
|
||||
|
||||
Map<String, Object> headerMap = this.getKey(exchangeTransferMoneyRequestDTO);
|
||||
|
||||
KMBalanceTransferStatusResponseDTO kmBalanceTransferStatusResponseDTO = KMClient.exchangeTransferStatus(exchangeTransferMoneyRequestDTO.getOrderId(), headerMap);
|
||||
Integer status = StatusType.IN_PROGRESS.getValue();
|
||||
if (ObjectUtils.isEmpty(kmBalanceTransferStatusResponseDTO.getErrorCode()) || this.getIsSuccess(kmBalanceTransferStatusResponseDTO.getErrorCode())) {
|
||||
status = StatusType.SUCCESS.getValue();
|
||||
} else {
|
||||
status = StatusType.FAILURE.getValue();
|
||||
}
|
||||
return ExchangeTransferStatusResponseDTO.builder()
|
||||
.statusType(status)
|
||||
.balance(kmBalanceTransferStatusResponseDTO.getAmt())
|
||||
.coinBefore(NumberUtil.sub(kmBalanceTransferStatusResponseDTO.getAmt(), kmBalanceTransferStatusResponseDTO.getPostbal()).abs())
|
||||
.coinAfter(kmBalanceTransferStatusResponseDTO.getPostbal())
|
||||
.build();
|
||||
}
|
||||
|
||||
|
||||
|
|
@ -514,7 +471,35 @@ public class GamesKMServiceImpl implements IGamesService {
|
|||
*/
|
||||
@Override
|
||||
public Boolean getBetRecordByHistoryTime(BetRecordByTimeDTO betRecordByTimeDTO) {
|
||||
return null;
|
||||
|
||||
log.info("GamesKMServiceImpl [getBetRecordByHistoryTime] 请求参数 {}", betRecordByTimeDTO);
|
||||
Map<String, Object> key = this.getKey(betRecordByTimeDTO);
|
||||
String startTime = null;
|
||||
String endTime = null;
|
||||
try {
|
||||
|
||||
|
||||
startTime = URLEncoder.encode(DateUtils.convertTimestampToFormattedDate(betRecordByTimeDTO.getStartTime(), DateUtils.ISO_8601_FORMAT, "GMT+8") + "+08:00", "UTF-8");
|
||||
endTime = URLEncoder.encode(DateUtils.convertTimestampToFormattedDate(betRecordByTimeDTO.getEndTime(), DateUtils.ISO_8601_FORMAT, "GMT+8") + "+08:00", "UTF-8");
|
||||
} catch (Exception e) {
|
||||
throw new BaseException(e.getMessage());
|
||||
}
|
||||
Map<String, Object> params = new LinkedHashMap<>();
|
||||
params.put("startdate", startTime);
|
||||
params.put("enddate", endTime);
|
||||
params.put("includetestplayers", Boolean.TRUE);
|
||||
params.put("issettled", Boolean.TRUE);
|
||||
|
||||
KMBetRecordResponse betRecordByTime = KMClient.getBetRecordByTime(JsonUtil.mapToQueryString(params), key);
|
||||
|
||||
if (ObjectUtils.isEmpty(betRecordByTime.getErrorCode()) || this.getIsSuccess(betRecordByTime.getErrorCode())) {
|
||||
this.batchInsert(betRecordByTime, betRecordByTimeDTO);
|
||||
return Boolean.TRUE;
|
||||
} else {
|
||||
log.error("GamesKMServiceImpl [getBetRecordByHistoryTime] 获取投注记录失败,错误代码{},错误信息{}", betRecordByTime.getErrorCode(), betRecordByTime.getErrorDescription());
|
||||
throw new BaseException(betRecordByTime.getErrorDescription());
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
/**
|
||||
|
|
@ -661,11 +646,7 @@ public class GamesKMServiceImpl implements IGamesService {
|
|||
public GameBettingDetails dataBuild(GamesDataBuildDTO gamesDataBuildDTO) {
|
||||
//转化类
|
||||
KMBetRecordResponse.Bet resultBean = (KMBetRecordResponse.Bet) gamesDataBuildDTO.getData();
|
||||
//
|
||||
// GameSecretKeyCurrency currencyDTO = gameSecretKeyCurrencyService.findByGameSecretKeyCurrencyDTO(GameSecretKeyCurrencyDTO.builder()
|
||||
// .platformCode(GamePlatforms.KM.getInfo())
|
||||
// .currency(resultBean.getCurrency())
|
||||
// .build());
|
||||
|
||||
|
||||
|
||||
Member member = memberService.selectMemberByGameAccount(resultBean.getUserId());
|
||||
|
|
@ -678,7 +659,6 @@ public class GamesKMServiceImpl implements IGamesService {
|
|||
e -> e,
|
||||
(existing, replacement) -> existing
|
||||
));
|
||||
;
|
||||
KMGameResponse.Game gamesDataDTO = dataDTOMap.get(resultBean.getGCode());
|
||||
|
||||
//输赢状态
|
||||
|
|
@ -702,7 +682,7 @@ public class GamesKMServiceImpl implements IGamesService {
|
|||
.gameCode(gamesDataDTO.getCode())
|
||||
.gameType(PlatformType.CARD_GAME.getCode())
|
||||
.platformCode(GamePlatforms.KM.getCode())
|
||||
.gameId(GAME_ID)
|
||||
.gameId(gamesDataDTO.getSystemGameId())
|
||||
.gameName(gamesDataDTO.getName())
|
||||
.gameStatus(gameStatus)
|
||||
.gameStatusType(1)
|
||||
|
|
|
|||
|
|
@ -3,6 +3,7 @@ package com.ff.game.api.meitian.client;
|
|||
import com.dtflys.forest.annotation.Address;
|
||||
import com.dtflys.forest.annotation.Post;
|
||||
import com.dtflys.forest.annotation.Var;
|
||||
import com.ff.game.api.km.dto.KMBalanceTransferStatusResponseDTO;
|
||||
import com.ff.game.api.meitian.address.MeiTianAddressSource;
|
||||
import com.ff.game.api.meitian.dto.*;
|
||||
|
||||
|
|
@ -103,6 +104,22 @@ public interface MeiTianClient {
|
|||
@Var("data") String data
|
||||
);
|
||||
|
||||
|
||||
/**
|
||||
* 汇兑转移状态
|
||||
*
|
||||
* @param merchantId 商户ID
|
||||
* @param playerName 玩家姓名
|
||||
* @param coins 硬币
|
||||
* @return {@link MeiTianBalanceTransferStatusResponseDTO }
|
||||
*/
|
||||
@Post("dg/player/queryTransbyId/{playerName}/{merchantId}/{extTransId}")
|
||||
MeiTianBalanceTransferStatusResponseDTO exchangeTransferStatus(
|
||||
@Var("playerName") String merchantId,
|
||||
@Var("merchantId") String playerName,
|
||||
@Var("extTransId") String coins
|
||||
);
|
||||
|
||||
/**
|
||||
* 按recordId获取投注记录
|
||||
*
|
||||
|
|
|
|||
|
|
@ -0,0 +1,69 @@
|
|||
package com.ff.game.api.meitian.dto;
|
||||
|
||||
import com.fasterxml.jackson.annotation.JsonProperty;
|
||||
import lombok.Data;
|
||||
|
||||
import java.math.BigDecimal;
|
||||
|
||||
/**
|
||||
* 梅田余额转移状态响应dto
|
||||
*
|
||||
* @author shi
|
||||
* @date 2025/04/08
|
||||
*/
|
||||
@Data
|
||||
public class MeiTianBalanceTransferStatusResponseDTO {
|
||||
/**
|
||||
* 响应结果代码
|
||||
*/
|
||||
@JsonProperty("resultCode")
|
||||
private Integer resultCode;
|
||||
|
||||
/**
|
||||
* 交易 ID
|
||||
*/
|
||||
@JsonProperty("transId")
|
||||
private String transId;
|
||||
|
||||
/**
|
||||
* 交易时间,格式为 yyyy-MM-dd HH:mm:ss
|
||||
*/
|
||||
@JsonProperty("transTime")
|
||||
private String transTime;
|
||||
|
||||
/**
|
||||
* 交易类型代码
|
||||
*/
|
||||
@JsonProperty("transType")
|
||||
private String transType;
|
||||
|
||||
/**
|
||||
* 交易金额
|
||||
*/
|
||||
@JsonProperty("transCoins")
|
||||
private BigDecimal transCoins;
|
||||
|
||||
/**
|
||||
* 当前余额
|
||||
*/
|
||||
@JsonProperty("curBalance")
|
||||
private BigDecimal curBalance;
|
||||
|
||||
/**
|
||||
* 时区信息,如:GMT+8
|
||||
*/
|
||||
@JsonProperty("timeZone")
|
||||
private String timeZone;
|
||||
|
||||
/**
|
||||
* 交易状态,1 表示成功
|
||||
*/
|
||||
@JsonProperty("status")
|
||||
private String status;
|
||||
|
||||
/**
|
||||
* 货币类型,如:CNY
|
||||
*/
|
||||
@JsonProperty("currency")
|
||||
private String currency;
|
||||
}
|
||||
|
|
@ -22,7 +22,7 @@ public class MeiTianGameDataDTO {
|
|||
/**
|
||||
*自己系统游戏id
|
||||
*/
|
||||
private Long systemGameId;
|
||||
private String systemGameId;
|
||||
private String gameId;
|
||||
private String cnName;
|
||||
private String enName;
|
||||
|
|
|
|||
|
|
@ -2,6 +2,7 @@ package com.ff.game.api.meitian.impl;
|
|||
|
||||
import cn.hutool.core.codec.Base64;
|
||||
import cn.hutool.core.util.IdUtil;
|
||||
import cn.hutool.core.util.NumberUtil;
|
||||
import com.alibaba.fastjson2.JSON;
|
||||
import com.ff.base.constant.CacheConstants;
|
||||
import com.ff.base.constant.Constants;
|
||||
|
|
@ -9,11 +10,13 @@ import com.ff.base.core.redis.RedisCache;
|
|||
import com.ff.base.enums.*;
|
||||
import com.ff.base.exception.base.ApiException;
|
||||
import com.ff.base.exception.base.BaseException;
|
||||
import com.ff.base.system.domain.SysConfig;
|
||||
import com.ff.base.system.service.impl.SysConfigServiceImpl;
|
||||
import com.ff.base.utils.DateUtils;
|
||||
import com.ff.base.utils.StringUtils;
|
||||
import com.ff.base.utils.sign.Md5Utils;
|
||||
import com.ff.base.utils.uuid.IdUtils;
|
||||
import com.ff.delay.DelayService;
|
||||
import com.ff.delay.DelayTask;
|
||||
import com.ff.game.api.IGamesService;
|
||||
import com.ff.game.api.meitian.client.MeiTianClient;
|
||||
import com.ff.game.api.meitian.dto.*;
|
||||
|
|
@ -51,7 +54,7 @@ import java.util.stream.Collectors;
|
|||
* @author shi
|
||||
* @date 2024/10/21
|
||||
*/
|
||||
@Service("MeiTianService")
|
||||
@Service("MTService")
|
||||
@Slf4j
|
||||
public class MeiTianGameServiceImpl implements IGamesService {
|
||||
|
||||
|
|
@ -77,6 +80,9 @@ public class MeiTianGameServiceImpl implements IGamesService {
|
|||
@Autowired
|
||||
private SysConfigServiceImpl sysConfigServiceImpl;
|
||||
|
||||
@Autowired
|
||||
private DelayService delayService;
|
||||
|
||||
/**
|
||||
* 获得就是成功
|
||||
*
|
||||
|
|
@ -217,23 +223,8 @@ public class MeiTianGameServiceImpl implements IGamesService {
|
|||
MeiTianGamesDTO gameList = new MeiTianGamesDTO();
|
||||
|
||||
for (MeiTianGameDataDTO gamesDataDTO : gameList.getData()) {
|
||||
/* GamePlatform gamePlatform = GamePlatform.builder()
|
||||
.platformType(MeiTianGameType.findSystemByCode(gamesDataDTO.getGameCategoryId()))
|
||||
.platformCode(GamePlatforms.MT.getCode())
|
||||
.build();
|
||||
List<GamePlatform> gamePlatforms = gamePlatformService.selectGamePlatformList(gamePlatform);
|
||||
//没有此平台就新增一个平台
|
||||
if (CollectionUtils.isEmpty(gamePlatforms)) {
|
||||
gamePlatform.setPlatformName(GamePlatforms.MT.getInfo() + MeiTianGameType.findInfoByCode(gamesDataDTO.getGameCategoryId()));
|
||||
gamePlatform.setSortNo(gamePlatformService.selectMaxSortNo() + 1);
|
||||
gamePlatform.setCreateBy(Constants.SYSTEM);
|
||||
gamePlatformService.insertGamePlatform(gamePlatform);
|
||||
} else {
|
||||
gamePlatform = gamePlatforms.get(0);
|
||||
}*/
|
||||
Integer platformType = MeiTianGameType.findSystemByCode(gamesDataDTO.getGameCategoryId());
|
||||
Game game = Game.builder()
|
||||
//.platformId(gamePlatform.getId())
|
||||
.platformCode(GamePlatforms.MT.getCode())
|
||||
.platformType(platformType)
|
||||
.gameCode(String.valueOf(gamesDataDTO.getGameId()))
|
||||
|
|
@ -248,7 +239,7 @@ public class MeiTianGameServiceImpl implements IGamesService {
|
|||
game.setCreateBy(Constants.SYSTEM);
|
||||
game.setPlatformType(platformType);
|
||||
game.setPlatformCode(GamePlatforms.MT.getCode());
|
||||
|
||||
game.setGameId(StringUtils.addSuffix(GamePlatforms.MT.getCode(), gamesDataDTO.getGameId()));
|
||||
List<NameInfo> nameInfos = new ArrayList<>();
|
||||
nameInfos.add(new NameInfo(gamesDataDTO.getCnName(), "zh-CN"));
|
||||
nameInfos.add(new NameInfo(gamesDataDTO.getEnName(), "en-US"));
|
||||
|
|
@ -256,25 +247,13 @@ public class MeiTianGameServiceImpl implements IGamesService {
|
|||
gameService.insertGame(game);
|
||||
} else {
|
||||
game = games.get(0);
|
||||
List<NameInfo> nameInfos = new ArrayList<>();
|
||||
nameInfos.add(new NameInfo(gamesDataDTO.getCnName(), "zh-CN"));
|
||||
nameInfos.add(new NameInfo(gamesDataDTO.getEnName(), "en-US"));
|
||||
game.setNameInfo(nameInfos);
|
||||
gameService.updateGame(game);
|
||||
}
|
||||
gamesDataDTO.setSystemGameId(game.getId());
|
||||
|
||||
/*List<GameName> gameNames = gameNameService.selectGameNameList(GameName.builder().gameId(game.getId()).gameName(game.getGameName()).build());
|
||||
if (CollectionUtils.isEmpty(gameNames)) {
|
||||
gameNameService.insertGameName(GameName.builder()
|
||||
.gameId(game.getId())
|
||||
.gameName(game.getGameName())
|
||||
.langCode("zh-CN")
|
||||
.createBy(Constants.SYSTEM)
|
||||
.build());
|
||||
gameNameService.insertGameName(GameName.builder()
|
||||
.gameId(game.getId())
|
||||
.gameName(gamesDataDTO.getEnName())
|
||||
.langCode("en-US")
|
||||
.createBy(Constants.SYSTEM)
|
||||
.build());
|
||||
}*/
|
||||
|
||||
gamesDataDTO.setSystemGameId(game.getGameId());
|
||||
}
|
||||
|
||||
redisCache.deleteObject(CacheConstants.MeiTian_GAMES);
|
||||
|
|
@ -284,6 +263,17 @@ public class MeiTianGameServiceImpl implements IGamesService {
|
|||
return CacheConstants.MeiTian_GAMES;
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* 获取交易id
|
||||
*
|
||||
* @param transactionIdRequestDTO 事务id请求dto
|
||||
* @return {@link String }
|
||||
*/
|
||||
@Override
|
||||
public String getTransactionId(TransactionIdRequestDTO transactionIdRequestDTO) {
|
||||
return GamePlatforms.MT.getCode() + IdUtils.simpleUUID();
|
||||
}
|
||||
/**
|
||||
* 按代理id进行交换转账
|
||||
*
|
||||
|
|
@ -293,49 +283,31 @@ public class MeiTianGameServiceImpl implements IGamesService {
|
|||
@Override
|
||||
@Transactional
|
||||
public Long exchangeTransferByAgentId(ExchangeTransferMoneyRequestDTO exchangeTransferMoneyRequestDTO) {
|
||||
// GameSecretKeyCurrencyDTO gameSecretKey = gameSecretKeyCurrencyService.findByGameSecretKeyCurrencyDTO(GameSecretKeyCurrencyDTO.builder()
|
||||
// .code(exchangeTransferMoneyRequestDTO.getAgentId())
|
||||
// .currency(exchangeTransferMoneyRequestDTO.getCurrency()).build());
|
||||
|
||||
Member member = memberService.selectMemberByGameAccount(exchangeTransferMoneyRequestDTO.getAccount());
|
||||
String transactionId = GamePlatforms.MT.getCode() + IdUtils.simpleUUID();
|
||||
|
||||
List<GameExchangeMoney> gameExchangeMonies = gameExchangeMoneyService.selectGameExchangeMoneyList(
|
||||
GameExchangeMoney.builder()
|
||||
.tenantKey(exchangeTransferMoneyRequestDTO.getTenantKey())
|
||||
.orderId(exchangeTransferMoneyRequestDTO.getOrderId())
|
||||
.build()
|
||||
);
|
||||
Assert.isTrue(CollectionUtils.isEmpty(gameExchangeMonies), "订单号重复");
|
||||
GameExchangeMoney exchangeMoney = gameExchangeMoneyService.selectGameExchangeMoneyById(exchangeTransferMoneyRequestDTO.getGameExchangeId());
|
||||
|
||||
|
||||
//获取下一个自增id
|
||||
GameExchangeMoney exchangeMoney = GameExchangeMoney
|
||||
.builder()
|
||||
.orderId(exchangeTransferMoneyRequestDTO.getOrderId())
|
||||
.tenantKey(exchangeTransferMoneyRequestDTO.getTenantKey())
|
||||
.quota(exchangeTransferMoneyRequestDTO.getQuota())
|
||||
.balance(exchangeTransferMoneyRequestDTO.getAmount())
|
||||
.exchangeType(exchangeTransferMoneyRequestDTO.getTransferType())
|
||||
.currencyCode(exchangeTransferMoneyRequestDTO.getSystemCurrency())
|
||||
.memberId(member.getId())
|
||||
.transactionId(transactionId)
|
||||
.platformCode(GamePlatforms.MT.getCode())
|
||||
.build();
|
||||
exchangeMoney.setCreateBy(Constants.SYSTEM);
|
||||
//接口限制限制50字符
|
||||
exchangeMoney.setTransactionId(transactionId);
|
||||
|
||||
|
||||
// String key = gameSecretKey.getKey();
|
||||
String key = exchangeTransferMoneyRequestDTO.getAgentKey();
|
||||
String merchantId = exchangeTransferMoneyRequestDTO.getAgentId();
|
||||
String playerName = exchangeTransferMoneyRequestDTO.getAccount();
|
||||
String coins = exchangeTransferMoneyRequestDTO.getAmount().setScale(4, RoundingMode.DOWN).toString();
|
||||
if (exchangeTransferMoneyRequestDTO.getTransferType().equals(TransferType.ALL.getCode())) {
|
||||
MemberInfoRequestDTO gamesBaseRequestDTO = MemberInfoRequestDTO.builder()
|
||||
.accounts(member.getGameAccount())
|
||||
.agentId(exchangeTransferMoneyRequestDTO.getAgentId())
|
||||
.currency(exchangeTransferMoneyRequestDTO.getCurrency())
|
||||
.agentKey(exchangeTransferMoneyRequestDTO.getAgentKey())
|
||||
.build();
|
||||
coins = this.getMemberInfo(gamesBaseRequestDTO).getBalance().setScale(4, RoundingMode.DOWN).toString();
|
||||
}
|
||||
|
||||
Map<String, String> rawMap = new LinkedHashMap<>();
|
||||
rawMap.put("merchantId", merchantId);
|
||||
rawMap.put("playerName", playerName);
|
||||
rawMap.put("extTransId", transactionId);
|
||||
rawMap.put("extTransId", exchangeTransferMoneyRequestDTO.getTransactionId());
|
||||
rawMap.put("coins", coins);
|
||||
String rawData = JSON.toJSONString(rawMap);
|
||||
String data = null;
|
||||
|
|
@ -354,7 +326,7 @@ public class MeiTianGameServiceImpl implements IGamesService {
|
|||
merchantId,
|
||||
playerName,
|
||||
coins,
|
||||
transactionId,
|
||||
exchangeTransferMoneyRequestDTO.getTransactionId(),
|
||||
md5Code,
|
||||
data
|
||||
);
|
||||
|
|
@ -362,16 +334,21 @@ public class MeiTianGameServiceImpl implements IGamesService {
|
|||
//判断是否转移成功
|
||||
if (this.isSuccess(exchangeMoneyResponse.getErrorCode())) {
|
||||
//更新数据
|
||||
exchangeMoney.setBalance(exchangeMoneyResponse.getBalance());
|
||||
BigDecimal transAmount = exchangeTransferMoneyRequestDTO.getAmount();
|
||||
BigDecimal transAmount = new BigDecimal(coins);
|
||||
exchangeMoney.setBalance(transAmount);
|
||||
|
||||
exchangeMoney.setCoinBefore(exchangeMoneyResponse.getBalance().subtract(transAmount));
|
||||
exchangeMoney.setCoinAfter(exchangeMoneyResponse.getBalance());
|
||||
exchangeMoney.setCurrencyBefore(exchangeMoneyResponse.getBalance().subtract(transAmount));
|
||||
exchangeMoney.setCurrencyAfter(exchangeMoneyResponse.getBalance());
|
||||
exchangeMoney.setStatus(1); // SUCCESS
|
||||
gameExchangeMoneyService.insertGameExchangeMoney(exchangeMoney);
|
||||
exchangeMoney.setStep(GameExchangeStep.PLATFORM_TRANSACTION.getCode());
|
||||
exchangeMoney.setStepStatus(GameExchangeStepStatus.SUCCESS.getCode());
|
||||
gameExchangeMoneyService.updateGameExchangeMoney(exchangeMoney);
|
||||
|
||||
} else {
|
||||
exchangeMoney.setStep(GameExchangeStep.PLATFORM_TRANSACTION.getCode());
|
||||
exchangeMoney.setStepStatus(GameExchangeStepStatus.FAILURE.getCode());
|
||||
gameExchangeMoneyService.updateGameExchangeMoney(exchangeMoney);
|
||||
throw new BaseException(MeiTianExchangeMoneyResponseDTO.TransferIn.get(exchangeMoneyResponse.getErrorCode()).getMessage());
|
||||
}
|
||||
|
||||
|
|
@ -382,7 +359,7 @@ public class MeiTianGameServiceImpl implements IGamesService {
|
|||
merchantId,
|
||||
playerName,
|
||||
coins,
|
||||
transactionId,
|
||||
exchangeTransferMoneyRequestDTO.getTransactionId(),
|
||||
md5Code,
|
||||
data
|
||||
);
|
||||
|
|
@ -390,15 +367,20 @@ public class MeiTianGameServiceImpl implements IGamesService {
|
|||
//判断是否转移成功
|
||||
if (this.isSuccess(exchangeMoneyResponse.getErrorCode())) {
|
||||
//更新数据
|
||||
exchangeMoney.setBalance(exchangeMoneyResponse.getBalance());
|
||||
BigDecimal transAmount = exchangeTransferMoneyRequestDTO.getAmount();
|
||||
BigDecimal transAmount = new BigDecimal(coins);
|
||||
exchangeMoney.setBalance(transAmount);
|
||||
|
||||
exchangeMoney.setCoinBefore(exchangeMoneyResponse.getBalance().add(transAmount));
|
||||
exchangeMoney.setCoinAfter(exchangeMoneyResponse.getBalance());
|
||||
exchangeMoney.setCurrencyBefore(exchangeMoneyResponse.getBalance().add(transAmount));
|
||||
exchangeMoney.setCurrencyAfter(exchangeMoneyResponse.getBalance());
|
||||
exchangeMoney.setStatus(1); // SUCCESS
|
||||
gameExchangeMoneyService.insertGameExchangeMoney(exchangeMoney);
|
||||
exchangeMoney.setStep(GameExchangeStep.PLATFORM_TRANSACTION.getCode());
|
||||
exchangeMoney.setStepStatus(GameExchangeStepStatus.SUCCESS.getCode());
|
||||
gameExchangeMoneyService.updateGameExchangeMoney(exchangeMoney);
|
||||
} else {
|
||||
exchangeMoney.setStep(GameExchangeStep.PLATFORM_TRANSACTION.getCode());
|
||||
exchangeMoney.setStepStatus(GameExchangeStepStatus.FAILURE.getCode());
|
||||
gameExchangeMoneyService.updateGameExchangeMoney(exchangeMoney);
|
||||
throw new BaseException(MeiTianExchangeMoneyResponseDTO.TransferOut.get(exchangeMoneyResponse.getErrorCode()).getMessage());
|
||||
}
|
||||
}
|
||||
|
|
@ -412,11 +394,61 @@ public class MeiTianGameServiceImpl implements IGamesService {
|
|||
* @return {@link Boolean }
|
||||
*/
|
||||
@Override
|
||||
public Boolean exchangeTransferStatus(ExchangeTransferStatusRequestDTO exchangeTransferMoneyRequestDTO) {
|
||||
return Boolean.TRUE;
|
||||
public ExchangeTransferStatusResponseDTO exchangeTransferStatus(ExchangeTransferStatusRequestDTO exchangeTransferMoneyRequestDTO) {
|
||||
log.info("MeiTianGameServiceImpl [exchangeTransferStatus] 请求参数 {}", exchangeTransferMoneyRequestDTO);
|
||||
|
||||
|
||||
String merchantId = exchangeTransferMoneyRequestDTO.getAgentId();
|
||||
String playerName = exchangeTransferMoneyRequestDTO.getAccount();
|
||||
|
||||
MeiTianBalanceTransferStatusResponseDTO meiTianBalanceTransferStatusResponseDTO = meiTianClient.exchangeTransferStatus(
|
||||
playerName,
|
||||
merchantId,
|
||||
exchangeTransferMoneyRequestDTO.getOrderId()
|
||||
);
|
||||
Integer status = StatusType.IN_PROGRESS.getValue();
|
||||
if (this.isSuccess(meiTianBalanceTransferStatusResponseDTO.getResultCode()) && "1".equals(meiTianBalanceTransferStatusResponseDTO.getStatus())) {
|
||||
status = StatusType.SUCCESS.getValue();
|
||||
} else {
|
||||
status = StatusType.FAILURE.getValue();
|
||||
}
|
||||
return ExchangeTransferStatusResponseDTO.builder()
|
||||
.statusType(status)
|
||||
.balance(meiTianBalanceTransferStatusResponseDTO.getTransCoins())
|
||||
.coinBefore(NumberUtil.sub(meiTianBalanceTransferStatusResponseDTO.getTransCoins(), meiTianBalanceTransferStatusResponseDTO.getCurBalance()).abs())
|
||||
.coinAfter(meiTianBalanceTransferStatusResponseDTO.getCurBalance())
|
||||
.build();
|
||||
}
|
||||
|
||||
|
||||
class GetRecordByTimeTask extends DelayTask {
|
||||
|
||||
BetRecordByTimeDTO betRecordByTimeDTO;
|
||||
|
||||
public GetRecordByTimeTask(BetRecordByTimeDTO betRecordByTimeDTO) {
|
||||
this.betRecordByTimeDTO = betRecordByTimeDTO;
|
||||
}
|
||||
|
||||
@Override
|
||||
public void execute() {
|
||||
doSyncRecordByRecordID(betRecordByTimeDTO);
|
||||
}
|
||||
}
|
||||
|
||||
class GetRecordByHistoryTimeTask extends DelayTask {
|
||||
|
||||
BetRecordByTimeDTO betRecordByTimeDTO;
|
||||
|
||||
public GetRecordByHistoryTimeTask(BetRecordByTimeDTO betRecordByTimeDTO) {
|
||||
this.betRecordByTimeDTO = betRecordByTimeDTO;
|
||||
}
|
||||
|
||||
@Override
|
||||
public void execute() {
|
||||
doSyncRecordByDate(betRecordByTimeDTO, 1);
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* 按时间获取投注记录
|
||||
*
|
||||
|
|
@ -425,18 +457,21 @@ public class MeiTianGameServiceImpl implements IGamesService {
|
|||
*/
|
||||
@Override
|
||||
public Boolean getBetRecordByTime(BetRecordByTimeDTO betRecordByTimeDTO) {
|
||||
return doSyncRecordByRecordID(betRecordByTimeDTO);
|
||||
delayService.addTask(new GetRecordByTimeTask(betRecordByTimeDTO));
|
||||
return Boolean.TRUE;
|
||||
//return doSyncRecordByRecordID(betRecordByTimeDTO);
|
||||
}
|
||||
|
||||
boolean doSyncRecordByRecordID(BetRecordByTimeDTO betRecordByTimeDTO) {
|
||||
String configKey = GamePlatforms.MT.getCode() + ":lastRecordID";
|
||||
String lastRecordID = sysConfigServiceImpl.selectConfigByKey(configKey);
|
||||
long recordID = 0;
|
||||
if (lastRecordID == null || lastRecordID.isEmpty()) {
|
||||
String configKey = GamePlatforms.MT.getCode() + ":lastSyncRecordID";
|
||||
Long recordID = redisCache.getCacheObject(configKey);
|
||||
|
||||
//String lastRecordID = sysConfigServiceImpl.selectConfigByKey(configKey);
|
||||
/*if (lastRecordID == null || lastRecordID.isEmpty()) {
|
||||
|
||||
} else {
|
||||
recordID = Long.parseLong(lastRecordID);
|
||||
}
|
||||
}*/
|
||||
String merchantId = betRecordByTimeDTO.getAgentId();
|
||||
Map<String, Object> rawMap = new LinkedHashMap<>();
|
||||
rawMap.put("recordID", recordID);
|
||||
|
|
@ -462,7 +497,9 @@ public class MeiTianGameServiceImpl implements IGamesService {
|
|||
//数据插入
|
||||
this.batchInsert(recordResponse, betRecordByTimeDTO);
|
||||
MeiTianBetRecordResponseDTO.DataBean dataBean = dataList.get(dataList.size() - 1);
|
||||
SysConfig config = sysConfigServiceImpl.getByConfigKey(configKey);
|
||||
redisCache.setCacheObject(configKey, Long.parseLong(dataBean.getRowID()));
|
||||
|
||||
/*SysConfig config = sysConfigServiceImpl.getByConfigKey(configKey);
|
||||
if (config == null) {
|
||||
config = new SysConfig();
|
||||
config.setConfigKey(configKey);
|
||||
|
|
@ -471,7 +508,7 @@ public class MeiTianGameServiceImpl implements IGamesService {
|
|||
} else {
|
||||
config.setConfigValue(dataBean.getRecordID());
|
||||
sysConfigServiceImpl.updateConfig(config);
|
||||
}
|
||||
}*/
|
||||
// 它每次返回25000条,所以需要判断,如果大于25000条,则继续拉取
|
||||
if (dataList.size() >= 25000) {
|
||||
doSyncRecordByRecordID(betRecordByTimeDTO);
|
||||
|
|
@ -487,22 +524,7 @@ public class MeiTianGameServiceImpl implements IGamesService {
|
|||
|
||||
String date = getDateStr(daysToSubtract);
|
||||
String configKey = GamePlatforms.MT.getCode() + ":lastSyncDate";
|
||||
String syncDateStr = sysConfigServiceImpl.selectConfigByKey(configKey);
|
||||
Map<String, Long> syncDateMap = new HashMap<>();
|
||||
long recordID = 0;
|
||||
if (syncDateStr == null || syncDateStr.isEmpty()) {
|
||||
} else {
|
||||
syncDateMap = JSON.parseObject(syncDateStr, Map.class);
|
||||
}
|
||||
if (syncDateMap.containsKey(date)) {
|
||||
recordID = syncDateMap.get(date);
|
||||
if (syncDateMap.size() > 10) {
|
||||
syncDateMap.clear();
|
||||
syncDateMap.put(date, recordID);
|
||||
}
|
||||
} else {
|
||||
syncDateMap.put(date, recordID);
|
||||
}
|
||||
long recordID = redisCache.getCacheObject(configKey);
|
||||
String merchantId = betRecordByTimeDTO.getAgentId();
|
||||
Map<String, Object> rawMap = new LinkedHashMap<>();
|
||||
rawMap.put("rowID", recordID);
|
||||
|
|
@ -530,8 +552,9 @@ public class MeiTianGameServiceImpl implements IGamesService {
|
|||
//数据插入
|
||||
this.batchInsert(recordResponse, betRecordByTimeDTO);
|
||||
MeiTianBetRecordResponseDTO.DataBean dataBean = dataList.get(dataList.size() - 1);
|
||||
syncDateMap.put(date, Long.parseLong(dataBean.getRowID()));
|
||||
SysConfig config = sysConfigServiceImpl.getByConfigKey(configKey);
|
||||
//syncDateMap.put(date, Long.parseLong(dataBean.getRowID()));
|
||||
redisCache.setCacheObject(configKey, Long.parseLong(dataBean.getRowID()));
|
||||
/*SysConfig config = sysConfigServiceImpl.getByConfigKey(configKey);
|
||||
if (null == config) {
|
||||
config = new SysConfig();
|
||||
config.setConfigKey(configKey);
|
||||
|
|
@ -540,7 +563,7 @@ public class MeiTianGameServiceImpl implements IGamesService {
|
|||
} else {
|
||||
config.setConfigValue(JSON.toJSONString(syncDateMap));
|
||||
sysConfigServiceImpl.updateConfig(config);
|
||||
}
|
||||
}*/
|
||||
|
||||
// 它每次返回25000条,所以需要判断,如果大于25000条,则继续拉取
|
||||
if (dataList.size() >= 25000) {
|
||||
|
|
@ -561,9 +584,10 @@ public class MeiTianGameServiceImpl implements IGamesService {
|
|||
*/
|
||||
@Override
|
||||
public Boolean getBetRecordByHistoryTime(BetRecordByTimeDTO betRecordByTimeDTO) {
|
||||
doSyncRecordByDate(betRecordByTimeDTO, 0);
|
||||
doSyncRecordByDate(betRecordByTimeDTO, 1); // yesterday
|
||||
//doSyncRecordByDate(betRecordByTimeDTO, 0);
|
||||
//doSyncRecordByDate(betRecordByTimeDTO, 1); // yesterday
|
||||
|
||||
delayService.addTask(new GetRecordByHistoryTimeTask(betRecordByTimeDTO));
|
||||
return true;
|
||||
}
|
||||
|
||||
|
|
@ -793,10 +817,6 @@ public class MeiTianGameServiceImpl implements IGamesService {
|
|||
}
|
||||
}
|
||||
|
||||
public LocalDate getDate(int daysToSubtract) {
|
||||
return LocalDate.now().minusDays(daysToSubtract); // 获取当前日期减去两天
|
||||
}
|
||||
|
||||
public String getDateStr(int daysToSubtract) {
|
||||
// 获取当前日期减去指定天数
|
||||
LocalDate date = LocalDate.now().minusDays(daysToSubtract);
|
||||
|
|
|
|||
|
|
@ -18,7 +18,6 @@ public class MyNGAddressSource implements AddressSource {
|
|||
|
||||
@Override
|
||||
public ForestAddress getAddress(ForestRequest request) {
|
||||
//String apiBaseUrl = configService.selectConfigByKey(Constants.NG_API_BASE_URL);
|
||||
String apiBaseUrl = platformService.get(GamePlatforms.PG.getCode())
|
||||
.getUrlInfo().getUrl();
|
||||
return new ForestAddress("https", apiBaseUrl, 443, "api");
|
||||
|
|
|
|||
|
|
@ -13,6 +13,7 @@ import com.ff.base.utils.DateUtils;
|
|||
import com.ff.base.utils.SleepUtil;
|
||||
import com.ff.base.utils.StringUtils;
|
||||
import com.ff.base.utils.sign.Md5Utils;
|
||||
import com.ff.base.utils.uuid.IdUtils;
|
||||
import com.ff.config.KeyConfig;
|
||||
import com.ff.game.api.IGamesService;
|
||||
import com.ff.game.api.ng.client.NGClient;
|
||||
|
|
@ -232,23 +233,8 @@ public class GamesPGServiceImpl implements IGamesService {
|
|||
ApiNGResponseDTO<List<ApiGameInfoResponseDTO>> gameList = ngClient.getGameList(paramsMap, headerMap);
|
||||
if (this.getIsSuccess(gameList.getCode())) {
|
||||
for (ApiGameInfoResponseDTO apiGameInfoResponseDTO : gameList.getData()) {
|
||||
/*GamePlatform gamePlatform = GamePlatform.builder()
|
||||
.platformType(NGGameType.findSystemByCode(apiGameInfoResponseDTO.getGameType()))
|
||||
.platformCode(GamePlatforms.PG.getCode())
|
||||
.build();
|
||||
List<GamePlatform> gamePlatforms = gamePlatformService.selectGamePlatformList(gamePlatform);
|
||||
//没有此平台就新增一个平台
|
||||
if (CollectionUtils.isEmpty(gamePlatforms)) {
|
||||
gamePlatform.setPlatformName(GamePlatforms.PG.getInfo() + NGGameType.findInfoByCode(apiGameInfoResponseDTO.getGameType()));
|
||||
gamePlatform.setSortNo(gamePlatformService.selectMaxSortNo() + 1);
|
||||
gamePlatform.setCreateBy(Constants.SYSTEM);
|
||||
gamePlatformService.insertGamePlatform(gamePlatform);
|
||||
} else {
|
||||
gamePlatform = gamePlatforms.get(0);
|
||||
}*/
|
||||
Integer platformType = NGGameType.findSystemByCode(apiGameInfoResponseDTO.getGameType());
|
||||
Game game = Game.builder()
|
||||
// .platformId(gamePlatform.getId())
|
||||
.platformCode(GamePlatforms.PG.getCode())
|
||||
.platformType(platformType)
|
||||
.gameCode(apiGameInfoResponseDTO.getGameCode())
|
||||
|
|
@ -264,6 +250,7 @@ public class GamesPGServiceImpl implements IGamesService {
|
|||
game.setCreateBy(Constants.SYSTEM);
|
||||
game.setPlatformCode(GamePlatforms.PG.getCode());
|
||||
game.setPlatformType(platformType);
|
||||
game.setGameId(StringUtils.addSuffix(GamePlatforms.PG.getCode(), apiGameInfoResponseDTO.getGameCode()));
|
||||
List<NameInfo> nameInfos = new ArrayList<>();
|
||||
nameInfos.add(new NameInfo(apiGameInfoResponseDTO.getGameName().get("zh-hans"), "zh-CN"));
|
||||
nameInfos.add(new NameInfo(apiGameInfoResponseDTO.getGameName().get("zh-hant"), "zh-TW"));
|
||||
|
|
@ -272,34 +259,14 @@ public class GamesPGServiceImpl implements IGamesService {
|
|||
gameService.insertGame(game);
|
||||
} else {
|
||||
game = games.get(0);
|
||||
List<NameInfo> nameInfos = new ArrayList<>();
|
||||
nameInfos.add(new NameInfo(apiGameInfoResponseDTO.getGameName().get("zh-hans"), "zh-CN"));
|
||||
nameInfos.add(new NameInfo(apiGameInfoResponseDTO.getGameName().get("zh-hant"), "zh-TW"));
|
||||
nameInfos.add(new NameInfo(apiGameInfoResponseDTO.getGameName().get("en"), "en-US"));
|
||||
game.setNameInfo(nameInfos);
|
||||
gameService.updateGame(game);
|
||||
}
|
||||
apiGameInfoResponseDTO.setSystemGameId(game.getId());
|
||||
/*Map<String, String> gameName = apiGameInfoResponseDTO.getGameName();
|
||||
for (String key : gameName.keySet()) {
|
||||
String name = gameName.get(key);
|
||||
List<GameName> gameNames = gameNameService.selectGameNameList(GameName.builder().gameId(game.getId()).gameName(name).build());
|
||||
if (CollectionUtils.isEmpty(gameNames)) {
|
||||
if ("zh-hans".equals(key)) {
|
||||
gameNameService.insertGameName(GameName.builder()
|
||||
.gameId(game.getId())
|
||||
.gameName(name)
|
||||
.langCode("zh-CN")
|
||||
.createBy(Constants.SYSTEM)
|
||||
.build());
|
||||
} else if (!"zh-hant".equals(key)) {
|
||||
GameSecretKeyLangDTO gameSecretKeyLangDTO = gameSecretKeyLangService.findGameSecretKeyLangDTO(GameSecretKeyLangDTO.builder()
|
||||
.platformCode(GamePlatforms.PG.getCode())
|
||||
.lang(key)
|
||||
.build());
|
||||
gameNameService.insertGameName(GameName.builder()
|
||||
.gameId(game.getId())
|
||||
.gameName(name)
|
||||
.langCode(gameSecretKeyLangDTO.getSystemLangCode())
|
||||
.createBy(Constants.SYSTEM)
|
||||
.build());
|
||||
}
|
||||
}
|
||||
}*/
|
||||
|
||||
|
||||
}
|
||||
|
|
@ -313,6 +280,19 @@ public class GamesPGServiceImpl implements IGamesService {
|
|||
return CacheConstants.PG_GAMES;
|
||||
}
|
||||
|
||||
/**
|
||||
* 获取交易id
|
||||
*
|
||||
* @param transactionIdRequestDTO 事务id请求dto
|
||||
* @return {@link String }
|
||||
*/
|
||||
@Override
|
||||
public String getTransactionId(TransactionIdRequestDTO transactionIdRequestDTO) {
|
||||
return gameExchangeMoneyService.getTransactionId(GamePlatforms.PG.getCode(), 32);
|
||||
}
|
||||
|
||||
|
||||
|
||||
/**
|
||||
* 按代理id进行交换转账
|
||||
*
|
||||
|
|
@ -324,50 +304,28 @@ public class GamesPGServiceImpl implements IGamesService {
|
|||
public Long exchangeTransferByAgentId(ExchangeTransferMoneyRequestDTO exchangeTransferMoneyRequestDTO) {
|
||||
log.info("GamesNGServiceImpl [exchangeTransferByAgentId] 请求参数 {}", exchangeTransferMoneyRequestDTO);
|
||||
|
||||
// GameSecretKeyCurrency currencyDTO = gameSecretKeyCurrencyService.findByGameSecretKeyCurrencyDTO(GameSecretKeyCurrencyDTO.builder()
|
||||
// .platformCode(GamePlatforms.PG.getCode())
|
||||
// .code(exchangeTransferMoneyRequestDTO.getAgentId())
|
||||
// .currency(exchangeTransferMoneyRequestDTO.getCurrency())
|
||||
// .build());
|
||||
|
||||
Member member = memberService.selectMemberByGameAccount(exchangeTransferMoneyRequestDTO.getAccount());
|
||||
String transactionId = gameExchangeMoneyService.getTransactionId(GamePlatforms.PG.getCode(), 32);
|
||||
List<GameExchangeMoney> gameExchangeMonies = gameExchangeMoneyService.selectGameExchangeMoneyList(
|
||||
GameExchangeMoney.builder()
|
||||
.tenantKey(exchangeTransferMoneyRequestDTO.getTenantKey())
|
||||
.orderId(exchangeTransferMoneyRequestDTO.getOrderId())
|
||||
.build()
|
||||
);
|
||||
Assert.isTrue(CollectionUtils.isEmpty(gameExchangeMonies), "订单号重复");
|
||||
GameExchangeMoney exchangeMoney = gameExchangeMoneyService.selectGameExchangeMoneyById(exchangeTransferMoneyRequestDTO.getGameExchangeId());
|
||||
|
||||
|
||||
//获取下一个自增id
|
||||
GameExchangeMoney exchangeMoney = GameExchangeMoney
|
||||
.builder()
|
||||
.tenantKey(exchangeTransferMoneyRequestDTO.getTenantKey())
|
||||
.orderId(exchangeTransferMoneyRequestDTO.getOrderId())
|
||||
.quota(exchangeTransferMoneyRequestDTO.getQuota())
|
||||
.balance(exchangeTransferMoneyRequestDTO.getAmount())
|
||||
.exchangeType(exchangeTransferMoneyRequestDTO.getTransferType())
|
||||
.currencyCode(exchangeTransferMoneyRequestDTO.getSystemCurrency())
|
||||
.memberId(member.getId())
|
||||
.transactionId(transactionId)
|
||||
.platformCode(GamePlatforms.PG.getCode())
|
||||
.build();
|
||||
exchangeMoney.setCreateBy(Constants.SYSTEM);
|
||||
|
||||
//获取余额
|
||||
String type = TransferType.ALL.getCode().equals(exchangeTransferMoneyRequestDTO.getTransferType()) ? NGTransferType.TRANSFER_OUT.getValue() : NGTransferType.TRANSFER_IN.getValue();
|
||||
//获取当前游戏币
|
||||
MemberInfoRequestDTO gamesBaseRequestDTO = MemberInfoRequestDTO.builder()
|
||||
.accounts(member.getGameAccount())
|
||||
.accounts(exchangeTransferMoneyRequestDTO.getAccount())
|
||||
.agentId(exchangeTransferMoneyRequestDTO.getAgentId())
|
||||
.agentKey(exchangeTransferMoneyRequestDTO.getAgentKey())
|
||||
.currency(exchangeTransferMoneyRequestDTO.getCurrency())
|
||||
.build();
|
||||
MemberInfoResponseDTO memberInfo = this.getMemberInfo(gamesBaseRequestDTO);
|
||||
|
||||
//判断是不是转出
|
||||
if (NGTransferType.TRANSFER_OUT.getValue().equals(type)) {
|
||||
MemberInfoResponseDTO memberInfo = this.getMemberInfo(gamesBaseRequestDTO);
|
||||
exchangeTransferMoneyRequestDTO.setAmount(memberInfo.getBalance());
|
||||
if (exchangeTransferMoneyRequestDTO.getAmount().compareTo(BigDecimal.ZERO) <= 0) {
|
||||
throw new ApiException(ErrorCode.INSUFFICIENT_PLAYER_BALANCE.getCode());
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
|
|
@ -377,7 +335,7 @@ public class GamesPGServiceImpl implements IGamesService {
|
|||
paramsMap.put("currency", exchangeTransferMoneyRequestDTO.getCurrency());
|
||||
paramsMap.put("type", type);
|
||||
paramsMap.put("amount", exchangeTransferMoneyRequestDTO.getAmount());
|
||||
paramsMap.put("orderId", transactionId);
|
||||
paramsMap.put("orderId", exchangeTransferMoneyRequestDTO.getTransactionId());
|
||||
|
||||
|
||||
Map<String, String> key = this.getKey(exchangeTransferMoneyRequestDTO);
|
||||
|
|
@ -385,16 +343,27 @@ public class GamesPGServiceImpl implements IGamesService {
|
|||
if (this.getIsSuccess(apiNGResponseDTO.getCode())) {
|
||||
//更新数据
|
||||
exchangeMoney.setBalance(exchangeTransferMoneyRequestDTO.getAmount());
|
||||
exchangeMoney.setStatus(StatusType.IN_PROGRESS.getValue());
|
||||
gameExchangeMoneyService.insertGameExchangeMoney(exchangeMoney);
|
||||
exchangeMoney.setStep(GameExchangeStep.PLATFORM_TRANSACTION.getCode());
|
||||
exchangeMoney.setStepStatus(GameExchangeStepStatus.SUCCESS.getCode());
|
||||
gameExchangeMoneyService.updateGameExchangeMoney(exchangeMoney);
|
||||
ExchangeTransferStatusRequestDTO exchangeTransferStatusRequestDTO = new ExchangeTransferStatusRequestDTO();
|
||||
exchangeTransferStatusRequestDTO.setAccount(exchangeTransferMoneyRequestDTO.getAccount());
|
||||
exchangeTransferStatusRequestDTO.setCurrency(exchangeTransferMoneyRequestDTO.getCurrency());
|
||||
exchangeTransferStatusRequestDTO.setOrderId(transactionId);
|
||||
exchangeTransferStatusRequestDTO.setOrderId(exchangeTransferMoneyRequestDTO.getTransactionId());
|
||||
exchangeTransferStatusRequestDTO.setAgentId(exchangeTransferMoneyRequestDTO.getAgentId());
|
||||
exchangeTransferStatusRequestDTO.setAgentKey(exchangeTransferMoneyRequestDTO.getAgentKey());
|
||||
this.exchangeTransferStatus(exchangeTransferStatusRequestDTO);
|
||||
ExchangeTransferStatusResponseDTO statusResponseDTO = this.exchangeTransferStatus(exchangeTransferStatusRequestDTO);
|
||||
//更新钱
|
||||
exchangeMoney.setBalance(statusResponseDTO.getBalance());
|
||||
exchangeMoney.setCoinBefore(statusResponseDTO.getCoinBefore());
|
||||
exchangeMoney.setCoinAfter(statusResponseDTO.getCoinAfter());
|
||||
exchangeMoney.setCurrencyBefore(exchangeMoney.getCoinBefore());
|
||||
exchangeMoney.setCurrencyAfter(exchangeMoney.getCoinAfter());
|
||||
gameExchangeMoneyService.updateGameExchangeMoney(exchangeMoney);
|
||||
} else {
|
||||
exchangeMoney.setStep(GameExchangeStep.PLATFORM_TRANSACTION.getCode());
|
||||
exchangeMoney.setStepStatus(GameExchangeStepStatus.FAILURE.getCode());
|
||||
gameExchangeMoneyService.updateGameExchangeMoney(exchangeMoney);
|
||||
log.error("GamesPGServiceImpl [exchangeTransferByAgentId] 金额转移失败,错误代码{},错误信息{}", apiNGResponseDTO.getCode(), apiNGResponseDTO.getMsg());
|
||||
throw new BaseException(apiNGResponseDTO.getMsg());
|
||||
}
|
||||
|
|
@ -408,8 +377,9 @@ public class GamesPGServiceImpl implements IGamesService {
|
|||
* @return {@link Boolean }
|
||||
*/
|
||||
@Override
|
||||
public Boolean exchangeTransferStatus(ExchangeTransferStatusRequestDTO exchangeTransferMoneyRequestDTO) {
|
||||
public ExchangeTransferStatusResponseDTO exchangeTransferStatus(ExchangeTransferStatusRequestDTO exchangeTransferMoneyRequestDTO) {
|
||||
|
||||
SleepUtil.sleep(1000);
|
||||
|
||||
Map<String, Object> paramsMap = new HashMap<>();
|
||||
paramsMap.put("playerId", exchangeTransferMoneyRequestDTO.getAccount());
|
||||
|
|
@ -417,32 +387,24 @@ public class GamesPGServiceImpl implements IGamesService {
|
|||
paramsMap.put("orderId", exchangeTransferMoneyRequestDTO.getOrderId());
|
||||
Map<String, String> key = this.getKey(exchangeTransferMoneyRequestDTO);
|
||||
ApiNGResponseDTO<ApiExchangeTransferStatusResponseDTO> apiNGResponseDTO = ngClient.exchangeTransferStatus(paramsMap, key);
|
||||
Integer status = StatusType.IN_PROGRESS.getValue();
|
||||
if (this.getIsSuccess(apiNGResponseDTO.getCode())) {
|
||||
ApiExchangeTransferStatusResponseDTO apiNGResponseDTOData = apiNGResponseDTO.getData();
|
||||
List<GameExchangeMoney> gameExchangeMonies = gameExchangeMoneyService.selectGameExchangeMoneyList(
|
||||
GameExchangeMoney.builder()
|
||||
.platformCode(GamePlatforms.PG.getCode())
|
||||
.transactionId(exchangeTransferMoneyRequestDTO.getOrderId())
|
||||
.build()
|
||||
);
|
||||
|
||||
for (GameExchangeMoney exchangeMoney : gameExchangeMonies) {
|
||||
//更新数据
|
||||
exchangeMoney.setBalance(apiNGResponseDTOData.getAmount().abs());
|
||||
exchangeMoney.setCoinBefore(NumberUtil.sub(apiNGResponseDTOData.getAfterBalance(), apiNGResponseDTOData.getAmount()));
|
||||
exchangeMoney.setCoinAfter(apiNGResponseDTOData.getAfterBalance());
|
||||
exchangeMoney.setCurrencyBefore(exchangeMoney.getCoinBefore());
|
||||
exchangeMoney.setCurrencyAfter(exchangeMoney.getCoinAfter());
|
||||
exchangeMoney.setStatus(apiNGResponseDTOData.getStatus());
|
||||
gameExchangeMoneyService.updateGameExchangeMoney(exchangeMoney);
|
||||
}
|
||||
return Boolean.TRUE;
|
||||
status = StatusType.SUCCESS.getValue();
|
||||
} else {
|
||||
log.error("GamesPGServiceImpl [exchangeTransferStatus]错误代码{},错误信息{}", apiNGResponseDTO.getCode(), apiNGResponseDTO.getMsg());
|
||||
return Boolean.FALSE;
|
||||
status = StatusType.FAILURE.getValue();
|
||||
}
|
||||
ExchangeTransferStatusResponseDTO transferStatusResponseDTO = ExchangeTransferStatusResponseDTO.builder()
|
||||
.statusType(status)
|
||||
.build();
|
||||
ApiExchangeTransferStatusResponseDTO apiNGResponseDTOData = apiNGResponseDTO.getData();
|
||||
if (!ObjectUtils.isEmpty(apiNGResponseDTOData)) {
|
||||
transferStatusResponseDTO.setBalance(apiNGResponseDTOData.getAmount().abs());
|
||||
transferStatusResponseDTO.setCoinBefore(NumberUtil.sub(apiNGResponseDTOData.getAmount(), apiNGResponseDTOData.getAfterBalance()).abs());
|
||||
transferStatusResponseDTO.setCoinAfter(apiNGResponseDTOData.getAfterBalance());
|
||||
}
|
||||
|
||||
|
||||
return transferStatusResponseDTO;
|
||||
}
|
||||
|
||||
|
||||
|
|
@ -455,14 +417,6 @@ public class GamesPGServiceImpl implements IGamesService {
|
|||
@Override
|
||||
public Boolean getBetRecordByTime(BetRecordByTimeDTO betRecordByTimeDTO) {
|
||||
|
||||
// GameSecretKeyCurrencyDTO gameSecretKeyDTO = new GameSecretKeyCurrencyDTO();
|
||||
// gameSecretKeyDTO.setPlatformCodes(NGPlatforms.getAllPlatforms());
|
||||
// List<GameSecretKeyCurrencyDTO> currencyDTOList = gameSecretKeyCurrencyService.findByGameSecretKeyCurrencyDTOList(gameSecretKeyDTO);
|
||||
// List<String> currencys = currencyDTOList.stream()
|
||||
// .map(GameSecretKeyCurrencyDTO::getCurrency)
|
||||
// .distinct()
|
||||
// .collect(Collectors.toList());
|
||||
|
||||
|
||||
Platform platform = betRecordByTimeDTO.getVendor();
|
||||
Set<String> cacheSet = redisCache.getCacheSet(CacheConstants.PG_GAMES_BET_CURRENCY);
|
||||
|
|
@ -480,14 +434,7 @@ public class GamesPGServiceImpl implements IGamesService {
|
|||
|
||||
String firstCurrency = currencys.get(0);
|
||||
|
||||
// GameSecretKeyCurrencyDTO currencyDTO = gameSecretKeyCurrencyService.findByGameSecretKeyCurrencyDTO(GameSecretKeyCurrencyDTO.builder()
|
||||
// .platformCode(GamePlatforms.PG.getCode())
|
||||
// .currency(firstCurrency)
|
||||
// .build());
|
||||
|
||||
|
||||
// betRecordByTimeDTO.setAgentId(currencyDTO.getCode());
|
||||
// betRecordByTimeDTO.setAgentKey(currencyDTO.getKey());
|
||||
int pageNo = 1;
|
||||
int pageSize = 2000;
|
||||
Map<String, Object> paramsMap = new HashMap<>();
|
||||
|
|
@ -753,10 +700,6 @@ public class GamesPGServiceImpl implements IGamesService {
|
|||
return null;
|
||||
}
|
||||
Game gamesDataDTO = games.get(0);
|
||||
// GameSecretKeyCurrency currencyDTO = gameSecretKeyCurrencyService.findByGameSecretKeyCurrencyDTO(GameSecretKeyCurrencyDTO.builder()
|
||||
// .platformCodes(NGPlatforms.getAllPlatforms())
|
||||
// .currency(resultBean.getCurrency())
|
||||
// .build());
|
||||
|
||||
Member member = memberService.selectMemberByGameAccount(resultBean.getPlayerId());
|
||||
if (ObjectUtils.isEmpty(member)) {
|
||||
|
|
@ -781,7 +724,7 @@ public class GamesPGServiceImpl implements IGamesService {
|
|||
.gameCode(gamesDataDTO.getGameCode())
|
||||
.gameType(NGGameType.findSystemByCode(resultBean.getGameType()))
|
||||
.platformCode(NGPlatforms.getByCode(resultBean.getPlatType()).getPlatform())
|
||||
.gameId(gamesDataDTO.getId())
|
||||
.gameId(gamesDataDTO.getGameId())
|
||||
.gameName(gamesDataDTO.getGameName())
|
||||
.gameStatus(gameStatus)
|
||||
.gameStatusType(1)
|
||||
|
|
|
|||
|
|
@ -0,0 +1,35 @@
|
|||
package com.ff.game.api.pgt.address;
|
||||
|
||||
import com.dtflys.forest.callback.AddressSource;
|
||||
import com.dtflys.forest.http.ForestAddress;
|
||||
import com.dtflys.forest.http.ForestRequest;
|
||||
import com.ff.base.constant.Constants;
|
||||
import com.ff.base.enums.GamePlatforms;
|
||||
import com.ff.base.system.service.ISysConfigService;
|
||||
import com.ff.game.service.IPlatformService;
|
||||
import org.springframework.stereotype.Component;
|
||||
|
||||
import javax.annotation.Resource;
|
||||
|
||||
|
||||
/**
|
||||
* 我 pt 泰国来源
|
||||
*
|
||||
* @author shi
|
||||
* @date 2025/02/10
|
||||
*/
|
||||
@Component
|
||||
public class MyPGTAddressSource implements AddressSource {
|
||||
@Resource
|
||||
private IPlatformService platformService;
|
||||
@Resource
|
||||
private ISysConfigService configService;
|
||||
|
||||
|
||||
@Override
|
||||
public ForestAddress getAddress(ForestRequest request) {
|
||||
String apiBaseUrl = platformService.get(GamePlatforms.PGT.getCode())
|
||||
.getUrlInfo().getUrl();
|
||||
return new ForestAddress("https",apiBaseUrl, 443,"");
|
||||
}
|
||||
}
|
||||
|
|
@ -0,0 +1,139 @@
|
|||
package com.ff.game.api.pgt.client;
|
||||
|
||||
import com.dtflys.forest.annotation.*;
|
||||
import com.ff.game.api.dg.dto.DGResponse;
|
||||
import com.ff.game.api.fc.dto.ApiFCGameListResponseDTO;
|
||||
import com.ff.game.api.jili.dto.JILIKickMemberAllDTO;
|
||||
import com.ff.game.api.jili.dto.JILIKickMemberDTO;
|
||||
import com.ff.game.api.ng.dto.ApiExchangeTransferStatusResponseDTO;
|
||||
import com.ff.game.api.ng.dto.ApiNGResponseDTO;
|
||||
import com.ff.game.api.pgt.address.MyPGTAddressSource;
|
||||
import com.ff.game.api.pgt.dto.*;
|
||||
import com.ff.game.api.pgx.dto.PGXPlayerStatusResponse;
|
||||
import com.ff.game.api.success.MySuccessCondition;
|
||||
import com.ff.game.api.xk.dto.XKKickMemberAllDTO;
|
||||
|
||||
import java.util.Map;
|
||||
|
||||
/**
|
||||
* pt 泰国
|
||||
*
|
||||
* @author shi
|
||||
* @date 2025/02/10
|
||||
*/
|
||||
@Address(source = MyPGTAddressSource.class)
|
||||
@Success(condition = MySuccessCondition.class)
|
||||
public interface PGTClient {
|
||||
/**
|
||||
* 创建成员
|
||||
*
|
||||
* @param parameters 范围
|
||||
* @param headerMap 标题映射
|
||||
* @return {@link String }
|
||||
*/
|
||||
@Post("/member")
|
||||
PGTCreateMemberResponse createMember(@JSONBody Map<String, Object> parameters, @Header Map<String, String> headerMap);
|
||||
|
||||
/**
|
||||
* 获取会员信息
|
||||
*
|
||||
* @param parameters 范围
|
||||
* @return {@link PGTBalanceResponse }
|
||||
*/
|
||||
@Get("/balance?${parameters}")
|
||||
PGTBalanceResponse getMemberInfo(@Var("parameters") String parameters, @Header Map<String, String> headerMap);
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
/**
|
||||
* 无重定向登录
|
||||
*
|
||||
* @param parameters 范围
|
||||
* @return {@link PGTLoginResponse }
|
||||
*/
|
||||
@Post("/logIn")
|
||||
PGTLoginResponse loginWithoutRedirect(@JSONBody Map<String, Object> parameters, @Header Map<String, String> headerMap);
|
||||
|
||||
|
||||
/**
|
||||
* 获取游戏列表
|
||||
*
|
||||
* @param parameters 范围
|
||||
* @param headerMap 标题映射
|
||||
* @return {@link PGTGameListResponse }
|
||||
*/
|
||||
@Get("/games?${parameters}")
|
||||
PGTGameListResponse getGameList(@Var("parameters") String parameters, @Header Map<String, String> headerMap);
|
||||
|
||||
|
||||
/**
|
||||
* 押金
|
||||
*
|
||||
* @param parameters 范围
|
||||
* @param headerMap 标题映射
|
||||
* @return {@link PGTExchangeTransferResponse }
|
||||
*/
|
||||
@Post(url = "/deposit")
|
||||
PGTExchangeTransferResponse deposit(@JSONBody Map<String, Object> parameters, @Header Map<String, String> headerMap);
|
||||
|
||||
|
||||
/**
|
||||
* 收回
|
||||
*
|
||||
* @param parameters 范围
|
||||
* @param headerMap 标题映射
|
||||
* @return {@link PGTExchangeTransferResponse }
|
||||
*/
|
||||
@Post(url = "/withdraw")
|
||||
PGTExchangeTransferResponse withdraw(@JSONBody Map<String, Object> parameters, @Header Map<String, String> headerMap);
|
||||
|
||||
/**
|
||||
* 汇兑转移状态
|
||||
*
|
||||
* @param parameters 范围
|
||||
* @param headerMap 标题映射
|
||||
* @return {@link ApiNGResponseDTO }<{@link ApiExchangeTransferStatusResponseDTO }>
|
||||
*/
|
||||
@Post(url = "/verifyDepositWithdraw")
|
||||
PGTTransactionResponse exchangeTransferStatus(@JSONBody Map<String, Object> parameters, @Header Map<String, String> headerMap);
|
||||
|
||||
|
||||
/**
|
||||
* 按时间获取投注记录
|
||||
*
|
||||
* @param parameters 范围
|
||||
* @param headerMap 标题映射
|
||||
* @return {@link PGTTransactionDetailsResponse }
|
||||
*/
|
||||
@Get(url = "/betTransactionsV2?{parameters}")
|
||||
PGTTransactionDetailsResponse getBetRecordByTime(@Var("parameters") String parameters, @Header Map<String, String> headerMap);
|
||||
|
||||
|
||||
/**
|
||||
* 投注交易回放
|
||||
*
|
||||
* @param parameters 范围
|
||||
* @param headerMap 标题映射
|
||||
* @return {@link PGTReplayUrlResponseDTO }
|
||||
*/
|
||||
@Get(url = "/betTransactionReplay?{parameters}")
|
||||
PGTReplayUrlResponseDTO betTransactionReplay(@Var("parameters") String parameters, @Header Map<String, String> headerMap);
|
||||
|
||||
|
||||
|
||||
/**
|
||||
* 踢出队员
|
||||
*
|
||||
* @param parameters 范围
|
||||
* @param headerMap 标题映射
|
||||
* @return {@link PGTKickMemberResponse }
|
||||
*/
|
||||
@Post("/seamless/kickOutPlayer")
|
||||
PGTKickMemberResponse kickMember(@JSONBody Map<String, Object> parameters, @Header Map<String, String> headerMap);
|
||||
|
||||
|
||||
|
||||
|
||||
}
|
||||
|
|
@ -0,0 +1,62 @@
|
|||
package com.ff.game.api.pgt.dto;
|
||||
|
||||
import com.fasterxml.jackson.annotation.JsonProperty;
|
||||
import lombok.Data;
|
||||
|
||||
import java.math.BigDecimal;
|
||||
|
||||
/**
|
||||
* PG平衡响应
|
||||
*
|
||||
* @author shi
|
||||
* @date 2025/04/03
|
||||
*/
|
||||
@Data
|
||||
public class PGTBalanceResponse {
|
||||
|
||||
/**
|
||||
* 每个请求的唯一引用
|
||||
*/
|
||||
@JsonProperty("reqId")
|
||||
private String reqId;
|
||||
|
||||
/**
|
||||
* 响应状态,通常为 0 表示成功,其他值表示错误
|
||||
*/
|
||||
@JsonProperty("code")
|
||||
private int code;
|
||||
|
||||
/**
|
||||
* 关于响应状态的其他信息
|
||||
*/
|
||||
@JsonProperty("message")
|
||||
private String message;
|
||||
|
||||
/**
|
||||
* 获取余额数据
|
||||
*/
|
||||
@JsonProperty("data")
|
||||
private BalanceData data;
|
||||
|
||||
@Data
|
||||
public static class BalanceData {
|
||||
|
||||
/**
|
||||
* 用户名
|
||||
*/
|
||||
@JsonProperty("username")
|
||||
private String username;
|
||||
|
||||
/**
|
||||
* 每个 productId 的当前余额
|
||||
*/
|
||||
@JsonProperty("balance")
|
||||
private BigDecimal balance;
|
||||
|
||||
/**
|
||||
* 响应状态
|
||||
*/
|
||||
@JsonProperty("status")
|
||||
private String status;
|
||||
}
|
||||
}
|
||||
Some files were not shown because too many files have changed in this diff Show More
Loading…
Reference in New Issue