package main
import (
"database/sql"
"fmt"
"log"
"math/rand"
"time"
_ "github.com/go-sql-driver/mysql"
)
type Lottery struct {
ID int
PublishType int
IsPublished bool
PublishTime time.Time
}
type Winner struct {
LotteryID int
UserID int
Prize string
}
func main() {
for {
currentTime := time.Now()
lotteries := queryLotteries(currentTime)
for _, lottery := range lotteries {
winners := drawLottery(lottery)
resultList := generateResultList(winners)
writeResultToDB(resultList)
updateLotteryStatus(lottery.ID)
notifyWinners(resultList)
}
time.Sleep(time.Minute)
}
}
func queryLotteries(currentTime time.Time) []Lottery {
db, err := sql.Open("mysql", "username:password@tcp(hostname:port)/database")
if err != nil {
log.Fatal(err)
}
defer db.Close()
query := "SELECT id, publish_type, is_published, publish_time FROM lottery WHERE publish_type = 1 AND !is_published AND publish_time <= ?"
rows, err := db.Query(query, currentTime)
if err != nil {
log.Fatal(err)
}
defer rows.Close()
var lotteries []Lottery
for rows.Next() {
var lottery Lottery
err := rows.Scan(&lottery.ID, &lottery.PublishType, &lottery.IsPublished, &lottery.PublishTime)
if err != nil {
log.Fatal(err)
}
lotteries = append(lotteries, lottery)
}
return lotteries
}
func drawLottery(lottery Lottery) []Winner {
db, err := sql.Open("mysql", "username:password@tcp(hostname:port)/database")
if err != nil {
log.Fatal(err)
}
defer db.Close()
query := "SELECT user_id FROM lottery_participants WHERE lottery_id = ?"
rows, err := db.Query(query, lottery.ID)
if err != nil {
log.Fatal(err)
}
defer rows.Close()
var participants []int
for rows.Next() {
var userID int
err := rows.Scan(&userID)
if err != nil {
log.Fatal(err)
}
participants = append(participants, userID)
}
rand.Seed(time.Now().UnixNano())
numWinners := 1
winners := make([]Winner, numWinners)
for i := 0; i < numWinners; i++ {
randomIndex := rand.Intn(len(participants))
winnerUserID := participants[randomIndex]
winner := Winner{
LotteryID: lottery.ID,
UserID: winnerUserID,
Prize: "奖品名称",
}
winners[i] = winner
participants = append(participants[:randomIndex], participants[randomIndex+1:]...)
}
return winners
}
func generateResultList(winners []Winner) []string {
resultList := make([]string, len(winners))
for i, winner := range winners {
result := fmt.Sprintf("中奖者:%d,奖品:%s", winner.UserID, winner.Prize)
resultList[i] = result
}
return resultList
}
func writeResultToDB(resultList []string) {
db, err := sql.Open("mysql", "username:password@tcp(hostname:port)/database")
if err != nil {
log.Fatal(err)
}
defer db.Close()
query := "INSERT INTO lottery_result (result) VALUES (?)"
tx, err := db.Begin()
if err != nil {
log.Fatal(err)
}
for _, result := range resultList {
_, err := tx.Exec(query, result)
if err != nil {
tx.Rollback()
log.Fatal(err)
}
}
err = tx.Commit()
if err != nil {
log.Fatal(err)
}
}
func updateLotteryStatus(lotteryID int) {
db, err := sql.Open("mysql", "username:password@tcp(hostname:port)/database")
if err != nil {
log.Fatal(err)
}
defer db.Close()
query := "UPDATE lottery SET is_published = true WHERE id = ?"
_, err = db.Exec(query, lotteryID)
if err != nil {
log.Fatal(err)
}
}
func notifyWinners(resultList []string) {
}
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· 【自荐】一款简洁、开源的在线白板工具 Drawnix
· 没有Manus邀请码?试试免邀请码的MGX或者开源的OpenManus吧
· 园子的第一款AI主题卫衣上架——"HELLO! HOW CAN I ASSIST YOU TODAY
· 无需6万激活码!GitHub神秘组织3小时极速复刻Manus,手把手教你使用OpenManus搭建本