package repository import ( "gorm.io/gorm" "ssq-desk/internal/database" "ssq-desk/internal/storage/models" "time" ) // MySQLSsqRepository MySQL 实现 type MySQLSsqRepository struct { db *gorm.DB } // NewMySQLSsqRepository 创建 MySQL 仓库 func NewMySQLSsqRepository() (SsqRepository, error) { db := database.GetMySQL() if db == nil { return nil, gorm.ErrInvalidDB } return &MySQLSsqRepository{db: db}, nil } // FindAll 查询所有历史数据 func (r *MySQLSsqRepository) FindAll() ([]models.SsqHistory, error) { var histories []models.SsqHistory err := r.db.Order("issue_number DESC").Find(&histories).Error return histories, err } // FindByIssue 根据期号查询 func (r *MySQLSsqRepository) FindByIssue(issueNumber string) (*models.SsqHistory, error) { var history models.SsqHistory err := r.db.Where("issue_number = ?", issueNumber).First(&history).Error if err == gorm.ErrRecordNotFound { return nil, nil } return &history, err } // FindByRedBalls 根据红球查询(支持部分匹配) func (r *MySQLSsqRepository) FindByRedBalls(redBalls []int) ([]models.SsqHistory, error) { if len(redBalls) == 0 { return r.FindAll() } var histories []models.SsqHistory query := r.db // 构建查询条件:红球在输入的红球列表中 for _, ball := range redBalls { query = query.Where("red_ball_1 = ? OR red_ball_2 = ? OR red_ball_3 = ? OR red_ball_4 = ? OR red_ball_5 = ? OR red_ball_6 = ?", ball, ball, ball, ball, ball, ball) } err := query.Order("issue_number DESC").Find(&histories).Error return histories, err } // FindByRedAndBlue 根据红球和蓝球查询 func (r *MySQLSsqRepository) FindByRedAndBlue(redBalls []int, blueBall int, blueBallRange []int) ([]models.SsqHistory, error) { var histories []models.SsqHistory query := r.db // 红球条件 if len(redBalls) > 0 { for _, ball := range redBalls { query = query.Where("red_ball_1 = ? OR red_ball_2 = ? OR red_ball_3 = ? OR red_ball_4 = ? OR red_ball_5 = ? OR red_ball_6 = ?", ball, ball, ball, ball, ball, ball) } } // 蓝球条件 if blueBall > 0 { query = query.Where("blue_ball = ?", blueBall) } else if len(blueBallRange) > 0 { query = query.Where("blue_ball IN ?", blueBallRange) } err := query.Order("issue_number DESC").Find(&histories).Error return histories, err } // Create 创建记录 func (r *MySQLSsqRepository) Create(history *models.SsqHistory) error { now := time.Now() if history.CreatedAt.IsZero() { history.CreatedAt = now } if history.UpdatedAt.IsZero() { history.UpdatedAt = now } return r.db.Create(history).Error } // BatchCreate 批量创建 func (r *MySQLSsqRepository) BatchCreate(histories []models.SsqHistory) error { if len(histories) == 0 { return nil } now := time.Now() for i := range histories { if histories[i].CreatedAt.IsZero() { histories[i].CreatedAt = now } if histories[i].UpdatedAt.IsZero() { histories[i].UpdatedAt = now } } return r.db.CreateInBatches(histories, 100).Error } // GetLatestIssue 获取最新期号 func (r *MySQLSsqRepository) GetLatestIssue() (string, error) { var history models.SsqHistory err := r.db.Order("issue_number DESC").First(&history).Error if err == gorm.ErrRecordNotFound { return "", nil } return history.IssueNumber, err } // Count 统计总数 func (r *MySQLSsqRepository) Count() (int64, error) { var count int64 err := r.db.Model(&models.SsqHistory{}).Count(&count).Error return count, err }