feat(sports): 重构 DB体育接口

- 修改了 CreateUserRequest 和 CreateUserResponse 的字段名称
- 重写了 DBSportsClient 接口中的方法
- 更新了 DBSportsServiceImpl 中的实现逻辑
- 新增了 GetBetListRequest 和 GetBetListResponse 类
-调整了 GetMemberInfoRequest 的结构
main-meitian
liaoyong 2025-04-11 10:59:27 +08:00
parent bf955ed14b
commit 0ce67f08ab
29 changed files with 754 additions and 869 deletions

View File

@ -16,6 +16,11 @@
<dependencies>
<!--<dependency>
<groupId>org.apache.rocketmq</groupId>
<artifactId>rocketmq-spring-boot-starter</artifactId>
<version>2.4.10</version> &lt;!&ndash; 请检查最新版本 &ndash;&gt;
</dependency>-->
<!-- spring-boot-devtools -->
<dependency>
<groupId>org.springframework.boot</groupId>

View File

@ -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);
/**
* FB0.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);
/**
* /
* DB0.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);
/**
* FBFB5
* IDID
* 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);
/**
* apptokenurltokenapp
*
* @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);
}

View File

@ -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;
}
}

View File

@ -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;
}
}

View File

@ -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;
}
}

View File

@ -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<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-H52-PC3-Android4-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;
}
}

View File

@ -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<String, Object> 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;
}
}

View File

@ -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<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
public static class MemberInfoDTO {
private BigDecimal balance;
private String userName;
}
}

View File

@ -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;
// 平台类型pch5, 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);
}
}

View File

@ -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<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; // 域名集合
}
}

View File

@ -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<UrlDTO> data;
private Integer code;
@Data
public static class UrlDTO implements Serializable {
private static final long serialVersionUID = 1L;
private int type; //域名类型1API2PUSH3H54PC5IMAGE , 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; // 权限值
}
}

View File

@ -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;
}
}

View File

@ -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;
}

View File

@ -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;
}
}

View File

@ -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<String> loginUrlArr; // loginUrl数组多个域名调试使用
}
}

View File

@ -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<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;
}
}

View File

@ -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<FileId> data;
@Data
public static class FileId implements Serializable {
private static final long serialVersionUID = 1L;
private Long fileId;
}
}

View File

@ -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<String, Object> map = new LinkedHashMap<>();
map.put("fileId", fileId);
return JSON.toJSONString(map);
}
}

View File

@ -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<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; // 数据变更标记
}
}

View File

@ -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<String, Object> 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;
}
}

View File

@ -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; // 交易时间
}

View File

@ -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<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);
}
}

View File

@ -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;
}

View File

@ -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<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);
}
}

View File

@ -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;
}

View File

@ -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;
}
}

View File

@ -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;
}
}

View File

@ -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"); // pch5, 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<GetUrlResponse.UrlDTO> 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<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;
if (this.isSuccess(response.getCode())) {
List<GetBetListResponse.OrderItemDTO> 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<OrderInfoResponse.OrderDTO> settledOrderList, BetRecordByTimeDTO betRecordByTimeDTO) {
private void batchInsert(List<GetBetListResponse.OrderItemDTO> settledOrderList, BetRecordByTimeDTO betRecordByTimeDTO) {
List<GameBettingDetails> gameBettingDetails = new ArrayList<>();
List<String> wagersIds = new ArrayList<>();
//数据组装
List<OrderInfoResponse.OrderDTO> dataList = settledOrderList;
List<GetBetListResponse.OrderItemDTO> 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<Game> 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);

View File

@ -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));