@@ -1,27 +1,38 @@
package com.tem.bocai.schedules ;
import com.tem.bocai.service.CompletedTodayService ;
import org.springframework.beans.factory.annotation.Autowired ;
import org.springframework.scheduling.annotation.Scheduled ;
import org.springframework.stereotype.Component ;
import java.io.FileReader ;
import java.io.IOException ;
import java.net.URI ;
import java.net.http.HttpClient ;
import java.net.http.HttpRequest ;
import java.net.http.HttpResponse ;
import java.time.LocalDateTime ;
import java.time.format.DateTimeFormatter ;
import org.json.JSONArray ;
import org.json.JSONObject ;
import org.json.JSONTokener ;
import com.tem.bocai.entity.LoginInfoResult ;
import com.tem.bocai.repository.LoginInfoRepository ;
@Component
public class BetSchedule {
@Autowired
CompletedTodayService completedTodayService ;
// 从6:15分开始每隔5分钟投注一次( 6:15, 6:20, 6:25...23:25)
// @Scheduled(cron = "0 15/5 6-23 * * ?")
@Scheduled( cron = " */9 * * * * ?" )
private LoginInfoRepository loginInfoRepository ;
// 每天早上7.07分开始, 每5分钟执行一次到第二天早上6点结束( 7:07, 7:12, 7:17...23:57, 0:02, 0:07...5:57)
// @Scheduled(cron = "0 7/5 7-23,0-6 * * ?" )
public void placeBet ( ) {
LocalDateTime now = LocalDateTime . now ( ) ;
int hour = now . getHour ( ) ;
int minute = now . getMinute ( ) ;
completedTodayService . sumResultAmount ( ) ;
// 检查是否在6:15到23:25 之间
if ( ( hour < 6 ) | | ( hour = = 6 & & minute < 15 ) | |
( hour > 23 ) | | ( hour = = 23 & & minute > 25 ) ) {
// 检查是否在7:07到第二天6:00 之间
// 如果时间在6:00到7:06之间, 则跳过执行
if ( ( hour = = 6 ) | | ( hour = = 7 & & minute < 7 ) ) {
String currentTime = now . format (
DateTimeFormatter . ofPattern ( " yyyy-MM-dd HH:mm:ss " )
) ;
@@ -29,11 +40,33 @@ public class BetSchedule {
return ;
}
// 根据LoginInfoResult 中的winNum, loseNum, onOff字段判断是否执行投注
String currentTime = now . format (
DateTimeFormatter . ofPattern ( " yyyy-MM-dd HH:mm:ss " )
) ;
LoginInfoResult loginInfo = loginInfoRepository . findFirstByOrderByCreateTimeDesc ( ) . orElse ( null ) ;
if ( loginInfo = = null ) {
System . out . println ( currentTime + " - 未找到登录信息,跳过执行 " ) ;
return ;
}
// 检查onOff字段是否为1( 开启状态)
if ( loginInfo . getOnOff ( ) ! = 1 ) {
System . out . println ( currentTime + " - 投注功能未开启,跳过执行 " ) ;
return ;
}
// 检查winNum和loseNum字段是否合理
Integer winNum = loginInfo . getWinNum ( ) ;
Integer loseNum = loginInfo . getLoseNum ( ) ;
if ( winNum = = null | | loseNum = = null ) {
System . out . println ( currentTime + " - 投注设置不完整,跳过执行 " ) ;
return ;
}
System . out . println ( currentTime + " - 开始执行投注... " ) ;
System . out . println ( " - 投注设置: 止盈点= " + winNum + " , 止亏点= " + loseNum + " , 状态= " + ( loginInfo . getOnOff ( ) = = 1 ? " 开启 " : " 关闭 " ) ) ;
try {
// 模拟投注逻辑
@@ -57,17 +90,86 @@ public class BetSchedule {
// 3. 执行投注操作
// 4. 记录投注结果
// 模拟投注过程
System . out . println ( " - 生成投注号码... " ) ;
System . out . println ( " - 计算投注金额... " ) ;
System . out . println ( " - 提交投注... " ) ;
System . out . println ( " - 记录投注结果... " ) ;
// 模拟网络延迟
try {
Thread . sleep ( 1000 ) ; // 模拟1秒的处理时间
} catch ( InterruptedException e ) {
Thread . currentThread ( ) . interrupt ( ) ;
// 1. 从json文件中获取投注号码
System . out . println ( " - 从json文件中获取投注号码... " ) ;
JSONObject betData = readBetDataFromJson ( ) ;
JSONArray betNumbers = betData . getJSONArray ( " betNumbers " ) ;
System . out . println ( " - 投注号码: " + betNumbers . toString ( ) ) ;
// 2. 计算投注金额
System . out . println ( " - 计算投注金额... " ) ;
double betAmount = betData . getDouble ( " betAmount " ) ;
System . out . println ( " - 投注金额: " + betAmount ) ;
// 3. 调用投注接口
System . out . println ( " - 提交投注... " ) ;
String betResult = callBetApi ( betNumbers , betAmount ) ;
System . out . println ( " - 投注结果: " + betResult ) ;
// 4. 记录投注结果
System . out . println ( " - 记录投注结果... " ) ;
recordBetResult ( betNumbers , betAmount , betResult ) ;
} catch ( Exception e ) {
System . err . println ( " - 投注执行失败: " ) ;
e . printStackTrace ( ) ;
}
}
/**
* 从json文件中读取投注数据
*/
private JSONObject readBetDataFromJson ( ) throws IOException {
// 假设json文件位于项目根目录的bet-data.json
String filePath = " bet-data.json " ;
FileReader reader = new FileReader ( filePath ) ;
JSONTokener tokener = new JSONTokener ( reader ) ;
JSONObject betData = new JSONObject ( tokener ) ;
reader . close ( ) ;
return betData ;
}
/**
* 调用投注接口
*/
private String callBetApi ( JSONArray betNumbers , double betAmount ) throws IOException , InterruptedException {
// 假设投注接口地址为http://localhost:8080/api/bet
String apiUrl = " http://localhost:8080/api/bet " ;
// 构建请求体
JSONObject requestBody = new JSONObject ( ) ;
requestBody . put ( " betNumbers " , betNumbers ) ;
requestBody . put ( " betAmount " , betAmount ) ;
requestBody . put ( " betTime " , LocalDateTime . now ( ) . format ( DateTimeFormatter . ofPattern ( " yyyy-MM-dd HH:mm:ss " ) ) ) ;
// 创建HTTP客户端和请求
HttpClient client = HttpClient . newHttpClient ( ) ;
HttpRequest request = HttpRequest . newBuilder ( )
. uri ( URI . create ( apiUrl ) )
. header ( " Content-Type " , " application/json " )
. POST ( HttpRequest . BodyPublishers . ofString ( requestBody . toString ( ) ) )
. build ( ) ;
// 发送请求并获取响应
HttpResponse < String > response = client . send ( request , HttpResponse . BodyHandlers . ofString ( ) ) ;
// 解析响应
if ( response . statusCode ( ) = = 200 ) {
JSONObject responseBody = new JSONObject ( response . body ( ) ) ;
return responseBody . getString ( " result " ) ;
} else {
return " error: " + response . statusCode ( ) ;
}
}
/**
* 记录投注结果
*/
private void recordBetResult ( JSONArray betNumbers , double betAmount , String betResult ) {
// 这里可以实现将投注结果记录到数据库或日志文件的逻辑
// 为了简单起见,我们这里只打印日志
String currentTime = LocalDateTime . now ( ) . format ( DateTimeFormatter . ofPattern ( " yyyy-MM-dd HH:mm:ss " ) ) ;
System . out . println ( " - 投注记录: [ " + currentTime + " ] 号码: " + betNumbers . toString ( ) + " , 金额: " + betAmount + " , 结果: " + betResult ) ;
}
}