From 0ce67f08ab33709254e337b639c87966cb2e6d0c Mon Sep 17 00:00:00 2001 From: cengy Date: Fri, 11 Apr 2025 10:59:27 +0800 Subject: [PATCH] =?UTF-8?q?feat(sports):=20=E9=87=8D=E6=9E=84=20DB?= =?UTF-8?q?=E4=BD=93=E8=82=B2=E6=8E=A5=E5=8F=A3?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - 修改了 CreateUserRequest 和 CreateUserResponse 的字段名称 - 重写了 DBSportsClient 接口中的方法 - 更新了 DBSportsServiceImpl 中的实现逻辑 - 新增了 GetBetListRequest 和 GetBetListResponse 类 -调整了 GetMemberInfoRequest 的结构 --- ff-game/pom.xml | 5 + .../ff/sports/db/client/DBSportsClient.java | 128 +++--- .../ff/sports/db/dto/CreateUserRequest.java | 6 +- .../ff/sports/db/dto/CreateUserResponse.java | 15 +- .../ff/sports/db/dto/GetBetListRequest.java | 93 ++++ .../ff/sports/db/dto/GetBetListResponse.java | 194 ++++++++ .../sports/db/dto/GetMemberInfoRequest.java | 27 +- .../sports/db/dto/GetMemberInfoResponse.java | 27 +- .../com/ff/sports/db/dto/GetTokenRequest.java | 30 -- .../ff/sports/db/dto/GetTokenResponse.java | 49 --- .../com/ff/sports/db/dto/GetUrlResponse.java | 33 -- .../com/ff/sports/db/dto/KickUserRequest.java | 24 + ...tUrlRequest.java => KickUserResponse.java} | 11 +- .../com/ff/sports/db/dto/LoginRequest.java | 57 +++ .../com/ff/sports/db/dto/LoginResponse.java | 34 ++ .../ff/sports/db/dto/OrderFilesRequest.java | 41 -- .../ff/sports/db/dto/OrderFilesResponse.java | 27 -- .../ff/sports/db/dto/OrderInfoRequest.java | 26 -- .../ff/sports/db/dto/OrderInfoResponse.java | 115 ----- .../sports/db/dto/TransferDetailRequest.java | 41 +- .../sports/db/dto/TransferDetailResponse.java | 34 +- .../ff/sports/db/dto/TransferInRequest.java | 46 -- .../ff/sports/db/dto/TransferInResponse.java | 20 - .../ff/sports/db/dto/TransferOutRequest.java | 46 -- .../ff/sports/db/dto/TransferOutResponse.java | 20 - .../com/ff/sports/db/dto/TransferRequest.java | 28 ++ .../ff/sports/db/dto/TransferResponse.java | 25 ++ .../sports/db/impl/DBSportsServiceImpl.java | 413 ++++++------------ .../sports/fb/impl/FBSportsServiceImpl.java | 8 +- 29 files changed, 754 insertions(+), 869 deletions(-) create mode 100644 ff-game/src/main/java/com/ff/sports/db/dto/GetBetListRequest.java create mode 100644 ff-game/src/main/java/com/ff/sports/db/dto/GetBetListResponse.java delete mode 100644 ff-game/src/main/java/com/ff/sports/db/dto/GetTokenRequest.java delete mode 100644 ff-game/src/main/java/com/ff/sports/db/dto/GetTokenResponse.java delete mode 100644 ff-game/src/main/java/com/ff/sports/db/dto/GetUrlResponse.java create mode 100644 ff-game/src/main/java/com/ff/sports/db/dto/KickUserRequest.java rename ff-game/src/main/java/com/ff/sports/db/dto/{GetUrlRequest.java => KickUserResponse.java} (50%) create mode 100644 ff-game/src/main/java/com/ff/sports/db/dto/LoginRequest.java create mode 100644 ff-game/src/main/java/com/ff/sports/db/dto/LoginResponse.java delete mode 100644 ff-game/src/main/java/com/ff/sports/db/dto/OrderFilesRequest.java delete mode 100644 ff-game/src/main/java/com/ff/sports/db/dto/OrderFilesResponse.java delete mode 100644 ff-game/src/main/java/com/ff/sports/db/dto/OrderInfoRequest.java delete mode 100644 ff-game/src/main/java/com/ff/sports/db/dto/OrderInfoResponse.java delete mode 100644 ff-game/src/main/java/com/ff/sports/db/dto/TransferInRequest.java delete mode 100644 ff-game/src/main/java/com/ff/sports/db/dto/TransferInResponse.java delete mode 100644 ff-game/src/main/java/com/ff/sports/db/dto/TransferOutRequest.java delete mode 100644 ff-game/src/main/java/com/ff/sports/db/dto/TransferOutResponse.java create mode 100644 ff-game/src/main/java/com/ff/sports/db/dto/TransferRequest.java create mode 100644 ff-game/src/main/java/com/ff/sports/db/dto/TransferResponse.java diff --git a/ff-game/pom.xml b/ff-game/pom.xml index 0751207..abeced9 100644 --- a/ff-game/pom.xml +++ b/ff-game/pom.xml @@ -16,6 +16,11 @@ + org.springframework.boot diff --git a/ff-game/src/main/java/com/ff/sports/db/client/DBSportsClient.java b/ff-game/src/main/java/com/ff/sports/db/client/DBSportsClient.java index 8d58440..c144449 100644 --- a/ff-game/src/main/java/com/ff/sports/db/client/DBSportsClient.java +++ b/ff-game/src/main/java/com/ff/sports/db/client/DBSportsClient.java @@ -20,83 +20,87 @@ public interface DBSportsClient { } ) CreateUserResponse createMember(@Body CreateUserRequest request, - @Header("requestId") @Var("requestId") String requestId, - @Header("lang") @Var("lang") String lang); + @Header("requestId") @Var("requestId") String requestId); /** - * 用户金额转入到FB体育平台,支持两位小数,最小0.01,必须是正数 + * 用户登录接口(注册和登录合并为一个接口) * * @param request - * @param sign - * @param timestamp - * @param merchantId - * @return {@link TransferInResponse} + * @param requestId + * @return */ - @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/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/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/fund/transfer", + headers = { + "Content-type: application/x-www-form-urlencoded" + } + ) + TransferResponse transferIn(@Body TransferRequest request, + @Header("requestId") @Var("requestId") String requestId + ); - @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); + @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); /** - * FB体育用拉取订单文件的方式同步订单数据,FB体育每5分钟生成一次订单文件, - * 通过此接口获取某一段时间内的文件ID列表,再通过文件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); + @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/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); + @Post(url = "/api/bet/queryBetListV2") + GetBetListResponse getBetList(@Body GetBetListRequest request, + @Header("requestId") String requestId); - - /** - * 获取用户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); } diff --git a/ff-game/src/main/java/com/ff/sports/db/dto/CreateUserRequest.java b/ff-game/src/main/java/com/ff/sports/db/dto/CreateUserRequest.java index e985d26..b8e3366 100644 --- a/ff-game/src/main/java/com/ff/sports/db/dto/CreateUserRequest.java +++ b/ff-game/src/main/java/com/ff/sports/db/dto/CreateUserRequest.java @@ -19,10 +19,10 @@ public class CreateUserRequest implements Serializable { private String currency; // 币种 private String nickname; // N 昵称 private String agentId; // N 信用网(代理id) - private String sign; // 签名 signature =MD5(MD5(userName +”&”+ merchantCode +”&”+ timestamp) + ”&”+ key) + private String signature; // 签名 signature =MD5(MD5(userName +”&”+ merchantCode +”&”+ timestamp) + ”&”+ key) - public void calcSign(String key) { + public void buildSignature(String key) { String signature = Md5Utils.md5New(Md5Utils.md5New(userName + "&" + merchantCode + "&" + timestamp) + "&" + key); - this.sign = signature; + this.signature = signature; } } diff --git a/ff-game/src/main/java/com/ff/sports/db/dto/CreateUserResponse.java b/ff-game/src/main/java/com/ff/sports/db/dto/CreateUserResponse.java index 6098450..ce2c62e 100644 --- a/ff-game/src/main/java/com/ff/sports/db/dto/CreateUserResponse.java +++ b/ff-game/src/main/java/com/ff/sports/db/dto/CreateUserResponse.java @@ -12,8 +12,15 @@ public class CreateUserResponse implements Serializable { private static final long serialVersionUID = 1L; - private Boolean success; - private Integer data; - private Integer code; - private String message; + private Boolean status; + private String msg; + private String code; + private Long serverTime; + private UserDTO data; + + @Data + public static class UserDTO { + private String userId; + } + } diff --git a/ff-game/src/main/java/com/ff/sports/db/dto/GetBetListRequest.java b/ff-game/src/main/java/com/ff/sports/db/dto/GetBetListRequest.java new file mode 100644 index 0000000..13f95cd --- /dev/null +++ b/ff-game/src/main/java/com/ff/sports/db/dto/GetBetListRequest.java @@ -0,0 +1,93 @@ +package com.ff.sports.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; + + /** + * 排序方式(可选) + * 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; + } +} diff --git a/ff-game/src/main/java/com/ff/sports/db/dto/GetBetListResponse.java b/ff-game/src/main/java/com/ff/sports/db/dto/GetBetListResponse.java new file mode 100644 index 0000000..aace488 --- /dev/null +++ b/ff-game/src/main/java/com/ff/sports/db/dto/GetBetListResponse.java @@ -0,0 +1,194 @@ +package com.ff.sports.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 Integer pageNum; + // 每页条数 + private Integer pageSize; + // 总条数 + private Integer totalCount; + // 注单列表 + private List 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 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; + } + +} diff --git a/ff-game/src/main/java/com/ff/sports/db/dto/GetMemberInfoRequest.java b/ff-game/src/main/java/com/ff/sports/db/dto/GetMemberInfoRequest.java index 015bc89..5255cb6 100644 --- a/ff-game/src/main/java/com/ff/sports/db/dto/GetMemberInfoRequest.java +++ b/ff-game/src/main/java/com/ff/sports/db/dto/GetMemberInfoRequest.java @@ -1,11 +1,9 @@ package com.ff.sports.db.dto; -import com.alibaba.fastjson2.JSON; +import com.ff.base.utils.sign.Md5Utils; import lombok.Data; import java.io.Serializable; -import java.util.LinkedHashMap; -import java.util.Map; /** * @author cengy @@ -15,13 +13,24 @@ public class GetMemberInfoRequest implements Serializable { private static final long serialVersionUID = 1L; /** - * 渠道用户id,不能为空 + * 用户名,不能为空 */ - private String merchantUserId; + private String userName; - public String toJSON() { - Map map = new LinkedHashMap<>(); - map.put("merchantUserId", merchantUserId); - return JSON.toJSONString(map); + /** + * 商户编码 + */ + 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; } } diff --git a/ff-game/src/main/java/com/ff/sports/db/dto/GetMemberInfoResponse.java b/ff-game/src/main/java/com/ff/sports/db/dto/GetMemberInfoResponse.java index 60cb4c7..1f329c0 100644 --- a/ff-game/src/main/java/com/ff/sports/db/dto/GetMemberInfoResponse.java +++ b/ff-game/src/main/java/com/ff/sports/db/dto/GetMemberInfoResponse.java @@ -13,26 +13,15 @@ import java.util.List; public class GetMemberInfoResponse implements Serializable { private static final long serialVersionUID = 1L; - private Boolean success; - private String message; - private MemberInfo data; - private Integer code; + private Boolean status; + private String msg; + private String code; + private Long serverTime; + private MemberInfoDTO data; @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 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 + public static class MemberInfoDTO { + private BigDecimal balance; + private String userName; } } diff --git a/ff-game/src/main/java/com/ff/sports/db/dto/GetTokenRequest.java b/ff-game/src/main/java/com/ff/sports/db/dto/GetTokenRequest.java deleted file mode 100644 index 83bfe60..0000000 --- a/ff-game/src/main/java/com/ff/sports/db/dto/GetTokenRequest.java +++ /dev/null @@ -1,30 +0,0 @@ -package com.ff.sports.db.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 map = new LinkedHashMap<>(); - map.put("merchantUserId", merchantUserId); - map.put("platForm", platForm); - return JSON.toJSONString(map); - } -} diff --git a/ff-game/src/main/java/com/ff/sports/db/dto/GetTokenResponse.java b/ff-game/src/main/java/com/ff/sports/db/dto/GetTokenResponse.java deleted file mode 100644 index 3dfb0df..0000000 --- a/ff-game/src/main/java/com/ff/sports/db/dto/GetTokenResponse.java +++ /dev/null @@ -1,49 +0,0 @@ -package com.ff.sports.db.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 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 domains; // 域名集合 - } -} diff --git a/ff-game/src/main/java/com/ff/sports/db/dto/GetUrlResponse.java b/ff-game/src/main/java/com/ff/sports/db/dto/GetUrlResponse.java deleted file mode 100644 index d622169..0000000 --- a/ff-game/src/main/java/com/ff/sports/db/dto/GetUrlResponse.java +++ /dev/null @@ -1,33 +0,0 @@ -package com.ff.sports.db.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 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 domainList; // 域名集合 - } - - @Data - public static class DomainDTO implements Serializable { - private static final long serialVersionUID = 1L; - private String domain; // 域名 - private int weight; // 权限值 - } -} diff --git a/ff-game/src/main/java/com/ff/sports/db/dto/KickUserRequest.java b/ff-game/src/main/java/com/ff/sports/db/dto/KickUserRequest.java new file mode 100644 index 0000000..809825d --- /dev/null +++ b/ff-game/src/main/java/com/ff/sports/db/dto/KickUserRequest.java @@ -0,0 +1,24 @@ +package com.ff.sports.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; + } +} diff --git a/ff-game/src/main/java/com/ff/sports/db/dto/GetUrlRequest.java b/ff-game/src/main/java/com/ff/sports/db/dto/KickUserResponse.java similarity index 50% rename from ff-game/src/main/java/com/ff/sports/db/dto/GetUrlRequest.java rename to ff-game/src/main/java/com/ff/sports/db/dto/KickUserResponse.java index 4ccc4d6..065e66a 100644 --- a/ff-game/src/main/java/com/ff/sports/db/dto/GetUrlRequest.java +++ b/ff-game/src/main/java/com/ff/sports/db/dto/KickUserResponse.java @@ -8,10 +8,13 @@ import java.io.Serializable; * @author cengy */ @Data -public class GetUrlRequest implements Serializable { +public class KickUserResponse implements Serializable { + private static final long serialVersionUID = 1L; - public String toJSON() { - return "{}"; - } + private Boolean status; + private String msg; + private String code; + private Long serverTime; + } diff --git a/ff-game/src/main/java/com/ff/sports/db/dto/LoginRequest.java b/ff-game/src/main/java/com/ff/sports/db/dto/LoginRequest.java new file mode 100644 index 0000000..f120b9b --- /dev/null +++ b/ff-game/src/main/java/com/ff/sports/db/dto/LoginRequest.java @@ -0,0 +1,57 @@ +package com.ff.sports.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; + } +} diff --git a/ff-game/src/main/java/com/ff/sports/db/dto/LoginResponse.java b/ff-game/src/main/java/com/ff/sports/db/dto/LoginResponse.java new file mode 100644 index 0000000..eafb9ba --- /dev/null +++ b/ff-game/src/main/java/com/ff/sports/db/dto/LoginResponse.java @@ -0,0 +1,34 @@ +package com.ff.sports.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 loginUrlArr; // loginUrl数组,多个域名,调试使用 + } + +} diff --git a/ff-game/src/main/java/com/ff/sports/db/dto/OrderFilesRequest.java b/ff-game/src/main/java/com/ff/sports/db/dto/OrderFilesRequest.java deleted file mode 100644 index 315b698..0000000 --- a/ff-game/src/main/java/com/ff/sports/db/dto/OrderFilesRequest.java +++ /dev/null @@ -1,41 +0,0 @@ -package com.ff.sports.db.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 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; - } -} diff --git a/ff-game/src/main/java/com/ff/sports/db/dto/OrderFilesResponse.java b/ff-game/src/main/java/com/ff/sports/db/dto/OrderFilesResponse.java deleted file mode 100644 index 2367773..0000000 --- a/ff-game/src/main/java/com/ff/sports/db/dto/OrderFilesResponse.java +++ /dev/null @@ -1,27 +0,0 @@ -package com.ff.sports.db.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 data; - - @Data - public static class FileId implements Serializable { - private static final long serialVersionUID = 1L; - private Long fileId; - } - -} diff --git a/ff-game/src/main/java/com/ff/sports/db/dto/OrderInfoRequest.java b/ff-game/src/main/java/com/ff/sports/db/dto/OrderInfoRequest.java deleted file mode 100644 index 9d51d78..0000000 --- a/ff-game/src/main/java/com/ff/sports/db/dto/OrderInfoRequest.java +++ /dev/null @@ -1,26 +0,0 @@ -package com.ff.sports.db.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 map = new LinkedHashMap<>(); - map.put("fileId", fileId); - return JSON.toJSONString(map); - } -} diff --git a/ff-game/src/main/java/com/ff/sports/db/dto/OrderInfoResponse.java b/ff-game/src/main/java/com/ff/sports/db/dto/OrderInfoResponse.java deleted file mode 100644 index b6910f6..0000000 --- a/ff-game/src/main/java/com/ff/sports/db/dto/OrderInfoResponse.java +++ /dev/null @@ -1,115 +0,0 @@ -package com.ff.sports.db.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 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 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; // 数据变更标记 - } - -} diff --git a/ff-game/src/main/java/com/ff/sports/db/dto/TransferDetailRequest.java b/ff-game/src/main/java/com/ff/sports/db/dto/TransferDetailRequest.java index 8bb2c9e..342144d 100644 --- a/ff-game/src/main/java/com/ff/sports/db/dto/TransferDetailRequest.java +++ b/ff-game/src/main/java/com/ff/sports/db/dto/TransferDetailRequest.java @@ -1,11 +1,9 @@ package com.ff.sports.db.dto; -import com.alibaba.fastjson2.JSON; +import com.ff.base.utils.sign.Md5Utils; import lombok.Data; import java.io.Serializable; -import java.util.LinkedHashMap; -import java.util.Map; /** * @author cengy @@ -13,27 +11,28 @@ import java.util.Map; @Data public class TransferDetailRequest implements Serializable { + /** + * 用户名,N + */ + private String userName; + /** + * 商户code + */ + private String merchantCode; + /** + * 交易id(19位数字) + */ + private String transferId; + + private String timestamp = System.currentTimeMillis() + ""; /** - * 业务id,不能为null + * 签名 */ - private String businessId; + private String signature; - /** - * 渠道用户ID,不能为null - */ - private String merchantUserId; - - /** - * 转账类型 , see enum: transfer_type_enum 不能为空 - */ - private String transferType; - - public String toJSON() { - Map map = new LinkedHashMap<>(); - map.put("businessId", businessId); - map.put("merchantUserId", merchantUserId); - map.put("transferType", transferType); - return JSON.toJSONString(map); + public void buildSignature(String key) { + String signature = Md5Utils.md5New(Md5Utils.md5New(merchantCode + "&" + transferId + "&" + timestamp) + "&" + key); + this.signature = signature; } } diff --git a/ff-game/src/main/java/com/ff/sports/db/dto/TransferDetailResponse.java b/ff-game/src/main/java/com/ff/sports/db/dto/TransferDetailResponse.java index 8f56651..77fba58 100644 --- a/ff-game/src/main/java/com/ff/sports/db/dto/TransferDetailResponse.java +++ b/ff-game/src/main/java/com/ff/sports/db/dto/TransferDetailResponse.java @@ -12,27 +12,27 @@ import java.math.BigDecimal; public class TransferDetailResponse implements Serializable { private static final long serialVersionUID = 1L; - private Boolean success; - private String message; - private TransferDetail data; - private Integer code; + private TransferDetailDTO data; + private Boolean status; + private String msg; + private String code; + private Long serverTime; @Data - public static class TransferDetail implements Serializable { + public static class TransferDetailDTO 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 + 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; // 交易时间 } diff --git a/ff-game/src/main/java/com/ff/sports/db/dto/TransferInRequest.java b/ff-game/src/main/java/com/ff/sports/db/dto/TransferInRequest.java deleted file mode 100644 index 31f13a4..0000000 --- a/ff-game/src/main/java/com/ff/sports/db/dto/TransferInRequest.java +++ /dev/null @@ -1,46 +0,0 @@ -package com.ff.sports.db.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 map = new LinkedHashMap<>(); - map.put("amount", amount); - map.put("businessId", businessId); - map.put("currencyId", currencyId); - map.put("merchantUserId", merchantUserId); - return JSON.toJSONString(map); - } -} diff --git a/ff-game/src/main/java/com/ff/sports/db/dto/TransferInResponse.java b/ff-game/src/main/java/com/ff/sports/db/dto/TransferInResponse.java deleted file mode 100644 index 3de12e9..0000000 --- a/ff-game/src/main/java/com/ff/sports/db/dto/TransferInResponse.java +++ /dev/null @@ -1,20 +0,0 @@ -package com.ff.sports.db.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; -} diff --git a/ff-game/src/main/java/com/ff/sports/db/dto/TransferOutRequest.java b/ff-game/src/main/java/com/ff/sports/db/dto/TransferOutRequest.java deleted file mode 100644 index bd26537..0000000 --- a/ff-game/src/main/java/com/ff/sports/db/dto/TransferOutRequest.java +++ /dev/null @@ -1,46 +0,0 @@ -package com.ff.sports.db.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 map = new LinkedHashMap<>(); - map.put("amount", amount); - map.put("businessId", businessId); - map.put("currencyId", currencyId); - map.put("merchantUserId", merchantUserId); - return JSON.toJSONString(map); - } -} diff --git a/ff-game/src/main/java/com/ff/sports/db/dto/TransferOutResponse.java b/ff-game/src/main/java/com/ff/sports/db/dto/TransferOutResponse.java deleted file mode 100644 index da1590c..0000000 --- a/ff-game/src/main/java/com/ff/sports/db/dto/TransferOutResponse.java +++ /dev/null @@ -1,20 +0,0 @@ -package com.ff.sports.db.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; -} diff --git a/ff-game/src/main/java/com/ff/sports/db/dto/TransferRequest.java b/ff-game/src/main/java/com/ff/sports/db/dto/TransferRequest.java new file mode 100644 index 0000000..9b500d3 --- /dev/null +++ b/ff-game/src/main/java/com/ff/sports/db/dto/TransferRequest.java @@ -0,0 +1,28 @@ +package com.ff.sports.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; + } + +} diff --git a/ff-game/src/main/java/com/ff/sports/db/dto/TransferResponse.java b/ff-game/src/main/java/com/ff/sports/db/dto/TransferResponse.java new file mode 100644 index 0000000..1ada1ab --- /dev/null +++ b/ff-game/src/main/java/com/ff/sports/db/dto/TransferResponse.java @@ -0,0 +1,25 @@ +package com.ff.sports.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; + } +} diff --git a/ff-game/src/main/java/com/ff/sports/db/impl/DBSportsServiceImpl.java b/ff-game/src/main/java/com/ff/sports/db/impl/DBSportsServiceImpl.java index 6aa4fef..2b74435 100644 --- a/ff-game/src/main/java/com/ff/sports/db/impl/DBSportsServiceImpl.java +++ b/ff-game/src/main/java/com/ff/sports/db/impl/DBSportsServiceImpl.java @@ -21,7 +21,6 @@ import com.ff.member.domain.Member; import com.ff.member.service.IMemberService; import com.ff.sports.db.client.DBSportsClient; import com.ff.sports.db.dto.*; -import com.ff.utils.TimestampFromString; import lombok.extern.slf4j.Slf4j; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; @@ -39,9 +38,9 @@ import java.util.stream.Collectors; /** - * FB体育 + * DB体育 * - * @author shi + * @author cengy * @date 2024/10/21 */ @Service("DBSportsService") @@ -73,8 +72,8 @@ public class DBSportsServiceImpl implements IGamesService { * @param errorCode 错误代码 * @return {@link Boolean } */ - private Boolean isSuccess(Integer errorCode) { - return 0 == errorCode; + private Boolean isSuccess(String errorCode) { + return "0000".equals(errorCode); } String getSign(String bodyJsonString, String merchantId, String merchantApiSecret, long requestTimestamp) { @@ -97,16 +96,16 @@ public class DBSportsServiceImpl implements IGamesService { request.setUserName(requestDTO.getAccount()); request.setMerchantCode(requestDTO.getAgentId()); request.setCurrency(requestDTO.getCurrency()); - request.calcSign(requestDTO.getAgentKey()); + request.buildSignature(requestDTO.getAgentKey()); - String lang = "zh"; + //String lang = requestDTO.getLan String requestId = IdUtils.fastUUID(); - CreateUserResponse response = dbSportsClient.createMember(request, requestId, lang); + CreateUserResponse response = dbSportsClient.createMember(request, requestId); if (isSuccess(response.getCode())) { return Boolean.TRUE; } - log.error("创建会员失败, errorCode:{}, errorMessage:{}", response.getCode(), response.getMessage()); + log.error("创建会员失败, errorCode:{}, errorMessage:{}", response.getCode(), response.getMsg()); throw new ApiException(ErrorCode.Create_Member_Failure.getCode()); } @@ -114,7 +113,7 @@ public class DBSportsServiceImpl implements IGamesService { /** * 按代理id进行交换转账 * - * @param requestDTO 外汇转账moeny dto + * @param requestDTO 外汇转账 * @return {@link Long } */ @Override @@ -148,32 +147,38 @@ public class DBSportsServiceImpl implements IGamesService { exchangeMoney.setTransactionId(transactionId); // 转入 if (requestDTO.getTransferType().equals(TransferType.GAMES.getCode())) { - TransferInRequest request = new TransferInRequest(); - request.setMerchantUserId(requestDTO.getAccount()); - request.setAmount(requestDTO.getAmount()); - request.setBusinessId(requestDTO.getOrderId()); - request.setCurrencyId(Integer.parseInt(requestDTO.getCurrency())); - long timestamp = System.currentTimeMillis(); - String jsonBody = request.toJSON(); - String sign = getSign(jsonBody, - requestDTO.getAgentId(), - requestDTO.getAgentKey(), - timestamp + TransferRequest request = new TransferRequest(); + request.setUserName(requestDTO.getAccount()); + request.setTransferType(1); + request.setTransferId(requestDTO.getOrderId()); + request.setMerchantCode(requestDTO.getAgentId()); + request.setAmount(requestDTO.getAmount().toString()); + request.buildSignature(requestDTO.getAgentKey()); + + TransferResponse response = dbSportsClient.transferIn( + request, IdUtils.fastUUID() ); - - TransferInResponse response = dbSportsClient.transferIn( - request, - sign, - timestamp, - requestDTO.getAgentId()); if (isSuccess(response.getCode())) { - - exchangeMoney.setBalance(response.getData()); - BigDecimal transAmount = requestDTO.getAmount(); - exchangeMoney.setCoinBefore(response.getData().subtract(transAmount)); - exchangeMoney.setCoinAfter(response.getData()); - exchangeMoney.setCurrencyBefore(response.getData().subtract(transAmount)); - exchangeMoney.setCurrencyAfter(response.getData()); + 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.setStatus(StatusType.SUCCESS.getValue()); // SUCCESS gameExchangeMoneyService.insertGameExchangeMoney(exchangeMoney); } else { @@ -187,39 +192,35 @@ public class DBSportsServiceImpl implements IGamesService { .agentKey(requestDTO.getAgentKey()) .build(); BigDecimal balance = this.getMemberInfo(memberInfoRequestDTO).getBalance(); + if (balance.compareTo(BigDecimal.ZERO) <= 0) { + throw new ApiException(ErrorCode.INSUFFICIENT_PLAYER_BALANCE.getCode()); + } - TransferOutRequest request = new TransferOutRequest(); - request.setMerchantUserId(requestDTO.getAccount()); - request.setAmount(/*requestDTO.getAmount()*/ balance); - request.setBusinessId(requestDTO.getOrderId()); - request.setCurrencyId(Integer.parseInt(requestDTO.getCurrency())); + TransferRequest request = new TransferRequest(); + request.setUserName(requestDTO.getAccount()); + request.setTransferType(2); // 转出 + request.setTransferId(requestDTO.getOrderId()); + request.setMerchantCode(requestDTO.getAgentId()); + request.setAmount(/*requestDTO.getAmount().toString()*/ balance.toString()); + request.buildSignature(requestDTO.getAgentKey()); - long timestamp = System.currentTimeMillis(); - String jsonBody = request.toJSON(); - String sign = getSign(jsonBody, - requestDTO.getAgentId(), - requestDTO.getAgentKey(), - timestamp - ); - - TransferOutResponse response = dbSportsClient + TransferResponse response = dbSportsClient .transferOut( - request, - sign, - timestamp, - requestDTO.getAgentId() + request, IdUtils.fastUUID() ); - //判断是否转移成功 if (this.isSuccess(response.getCode())) { - //更新数据 - exchangeMoney.setBalance(response.getData()); BigDecimal transAmount = balance; - exchangeMoney.setCoinBefore(response.getData().add(transAmount)); - exchangeMoney.setCoinAfter(response.getData()); - exchangeMoney.setCurrencyBefore(response.getData().add(transAmount)); - exchangeMoney.setCurrencyAfter(response.getData()); + BigDecimal beforeAmount = balance; + BigDecimal afterAmount = BigDecimal.ZERO; + + //更新数据 + exchangeMoney.setBalance(transAmount); + exchangeMoney.setCoinBefore(beforeAmount); + exchangeMoney.setCoinAfter(afterAmount); + exchangeMoney.setCurrencyBefore(beforeAmount); + exchangeMoney.setCurrencyAfter(afterAmount); exchangeMoney.setStatus(StatusType.SUCCESS.getValue()); // SUCCESS gameExchangeMoneyService.insertGameExchangeMoney(exchangeMoney); } else { @@ -238,35 +239,20 @@ public class DBSportsServiceImpl implements IGamesService { @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 = dbSportsClient.getMemberInfo( - request, - sign, - timestamp, - requestDTO.getAgentId() - ); + 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())) { - 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) + .balance(response.getData().getBalance()) .account(requestDTO.getAccounts()) .build(); - } else { - throw new ApiException(ErrorCode.Get_Member_Info_Failure.getCode()); } + throw new ApiException(ErrorCode.Get_Member_Info_Failure.getCode()); } /** @@ -277,84 +263,36 @@ public class DBSportsServiceImpl implements IGamesService { */ @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 = dbSportsClient.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体育"; + 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()); - /*GetUrlRequest request = new GetUrlRequest(); - long timestamp = System.currentTimeMillis(); - String jsonBody = request.toJSON(); - String sign = getSign(jsonBody, - requestDTO.getAgentId(), - requestDTO.getAgentKey(), - timestamp + LoginResponse response = dbSportsClient.login( + request, IdUtils.fastUUID() ); - GetUrlResponse response = fbSportsClient.getUrl( - request, - sign, - timestamp, - requestDTO.getAgentId() - ); - //判断是否获取成功 + if (this.isSuccess(response.getCode())) { - List urlDTOS = new ArrayList<>(); - for (GetUrlResponse.UrlDTO urlDTO : response.getData()) { - if (urlDTO.getType() == 3) { // 3:h5 - urlDTOS.add(urlDTO); - } - } - if (urlDTOS.isEmpty()){ + LoginResponse.LoginRespDTO respDTO = response.getData(); + + String loginURL = respDTO.getLoginUrl(); + if (StringUtils.isEmpty(loginURL)) { 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(); - }*/ + + return loginURL; + } throw new ApiException(ErrorCode.Get_Url_Failure.getCode()); } - private static final Long GAME_ID = 11111L; - /** * 获取游戏列表 * @@ -418,23 +356,13 @@ public class DBSportsServiceImpl implements IGamesService { 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 - ); + request.setMerchantCode(requestDTO.getAgentId()); + request.setTransferId(gameExchangeMoney.getOrderId()); + request.buildSignature(requestDTO.getAgentKey()); TransferDetailResponse response = dbSportsClient.transferDetail( - request, - sign, - timestamp, - requestDTO.getAgentId() + request, IdUtils.fastUUID() ); - if (this.isSuccess(response.getCode())) { + if (this.isSuccess(response.getCode()) && response.getData().getStatus() == 1) { status = StatusType.SUCCESS.getValue(); } else { status = StatusType.FAILURE.getValue(); @@ -458,75 +386,34 @@ public class DBSportsServiceImpl implements IGamesService { */ @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 = dbSportsClient.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; + this.getRealtimeRecord(requestDTO, 1); + + return Boolean.TRUE; } - 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 + 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() ); - OrderInfoResponse orderInfoResponse = dbSportsClient.getOrderJsonData( - request, - sign, - timestamp, - requestDTO.getAgentId() - ); - if (!this.isSuccess(orderInfoResponse.getCode())) { - return; - } - List 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; + if (this.isSuccess(response.getCode())) { + List list = response.getList(); + if (CollectionUtils.isEmpty(list)) { + return; } - settledOrderList.add(orderDTO); + this.batchInsert(list, requestDTO); + getRealtimeRecord(requestDTO, ++pageNum); } - this.batchInsert(settledOrderList, requestDTO); } /** @@ -537,39 +424,8 @@ public class DBSportsServiceImpl implements IGamesService { */ @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 = dbSportsClient.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; + return Boolean.TRUE; } @@ -604,6 +460,14 @@ public class DBSportsServiceImpl implements IGamesService { @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; } @@ -656,17 +520,20 @@ public class DBSportsServiceImpl implements IGamesService { * * @param settledOrderList 投注记录 */ - private void batchInsert(List settledOrderList, BetRecordByTimeDTO betRecordByTimeDTO) { + private void batchInsert(List settledOrderList, BetRecordByTimeDTO betRecordByTimeDTO) { List gameBettingDetails = new ArrayList<>(); List wagersIds = new ArrayList<>(); //数据组装 - List dataList = settledOrderList; + List dataList = settledOrderList; if (CollectionUtils.isEmpty(dataList)) { return; } //数据转化 - for (OrderInfoResponse.OrderDTO dataBean : dataList) { + for (GetBetListResponse.OrderItemDTO dataBean : dataList) { + if (dataBean.getOrderStatus() != 1) { // 只关心结算的 + continue; + } GameBettingDetails bettingDetails = this.dataBuild(GamesDataBuildDTO.builder() .platform(betRecordByTimeDTO.getVendor()) .data(dataBean).build()); @@ -674,7 +541,7 @@ public class DBSportsServiceImpl implements IGamesService { bettingDetails.setId(IdUtil.getSnowflakeNextId()); gameBettingDetails.add(bettingDetails); } - wagersIds.add(dataBean.getId()); + wagersIds.add(dataBean.getOrderNo()); } if (CollectionUtils.isEmpty(gameBettingDetails)) { return; @@ -701,21 +568,21 @@ public class DBSportsServiceImpl implements IGamesService { public GameBettingDetails dataBuild(GamesDataBuildDTO gamesDataBuildDTO) { //转化类 - OrderInfoResponse.OrderDTO dataBean = (OrderInfoResponse.OrderDTO) gamesDataBuildDTO.getData(); - Member member = memberService.selectMemberByGameAccount(dataBean.getMerchantUserId()); + GetBetListResponse.OrderItemDTO dataBean = (GetBetListResponse.OrderItemDTO) gamesDataBuildDTO.getData(); + Member member = memberService.selectMemberByGameAccount(dataBean.getUserName()); if (ObjectUtils.isEmpty(member)) { return null; } //List gameList = redisCache.getCacheList(CacheConstants.DB_Sports); //Game game = gameList.get(0); - BigDecimal originPayoffAmount = new BigDecimal(dataBean.getSettleAmount()); - BigDecimal betAmount = new BigDecimal(dataBean.getStakeAmount()); + BigDecimal originPayoffAmount = BigDecimal.valueOf(dataBean.getSettleAmount()); + BigDecimal betAmount = new BigDecimal(dataBean.getOrderAmount()); int compareResult = originPayoffAmount.compareTo(betAmount); - long payoffTime = TimestampFromString.to(dataBean.getSettleTime()); - long createTime = TimestampFromString.to(dataBean.getCreateTime()); + long payoffTime = dataBean.getSettleTime(); + long createTime = dataBean.getCreateTime(); Platform platform = gamesDataBuildDTO.getPlatform(); - String systemCurrency = platform.getOurCurrency(dataBean.getCurrency().toString()); + String systemCurrency = platform.getOurCurrency(dataBean.getCurrency()); //数据构造 GameBettingDetails gameBettingDetails = GameBettingDetails.builder() .tenantKey(member.getTenantKey()) @@ -729,16 +596,16 @@ public class DBSportsServiceImpl implements IGamesService { .gameName(GamePlatforms.DBSports.getInfo()) .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()) + .gameCurrencyCode(dataBean.getCurrency()) + .account(dataBean.getUserName()) + .wagersId(dataBean.getOrderNo()) .wagersTime(createTime) .betAmount(betAmount) .payoffTime(payoffTime) .payoffAmount(originPayoffAmount.abs()) .settlementTime(payoffTime) .turnover(betAmount) - .orderNo(dataBean.getId()) + .orderNo(dataBean.getOrderNo()) .settlementStatus(SettlementStatusEnum.COMPLETED.getCode()) .build(); gameBettingDetails.setCreateBy(Constants.SYSTEM); diff --git a/ff-game/src/main/java/com/ff/sports/fb/impl/FBSportsServiceImpl.java b/ff-game/src/main/java/com/ff/sports/fb/impl/FBSportsServiceImpl.java index 3f5f6d9..15232d8 100644 --- a/ff-game/src/main/java/com/ff/sports/fb/impl/FBSportsServiceImpl.java +++ b/ff-game/src/main/java/com/ff/sports/fb/impl/FBSportsServiceImpl.java @@ -176,9 +176,9 @@ public class FBSportsServiceImpl implements IGamesService { timestamp, requestDTO.getAgentId()); if (isSuccess(response.getCode())) { - - exchangeMoney.setBalance(response.getData()); BigDecimal transAmount = requestDTO.getAmount(); + + exchangeMoney.setBalance(transAmount); exchangeMoney.setCoinBefore(response.getData().subtract(transAmount)); exchangeMoney.setCoinAfter(response.getData()); exchangeMoney.setCurrencyBefore(response.getData().subtract(transAmount)); @@ -222,9 +222,9 @@ public class FBSportsServiceImpl implements IGamesService { //判断是否转移成功 if (this.isSuccess(response.getCode())) { - //更新数据 - exchangeMoney.setBalance(response.getData()); BigDecimal transAmount = balance; + //更新数据 + exchangeMoney.setBalance(transAmount); exchangeMoney.setCoinBefore(response.getData().add(transAmount)); exchangeMoney.setCoinAfter(response.getData()); exchangeMoney.setCurrencyBefore(response.getData().add(transAmount));