package service import ( "fmt" "gorm.io/gorm" ) // LimitBoardService 提供涨停板概览、分组、收益统计等业务能力。 type LimitBoardService struct { DB *gorm.DB // 数据库连接。 } // stockLimitCombinedTable 是涨停合并数据表名,集中定义便于多个查询复用。 const stockLimitCombinedTable = "stock_limit_combined_data" // boardLabel 把连续涨停天数转换为中文连板标签。 func boardLabel(boardCount int) string { switch boardCount { case 1: return "首板" case 2: return "二板" case 3: return "三板" case 4: return "四板" case 5: return "五板" case 6: return "六板" case 7: return "七板" case 8: return "八板" case 9: return "九板" default: return fmt.Sprintf("%d板", boardCount) } } // loadTradeCalendar 查询不晚于 tradeDate 的上交所开市日,并返回 tradeDate 在切片中的索引。 // // dateIndex 为 -1 表示传入日期不是当前交易日历中的开市日。 func (s *LimitBoardService) loadTradeCalendar(tradeDate string) ([]string, int, error) { var tradeDates []string if err := s.DB.Table("trade_calendar"). Select("DATE_FORMAT(cal_date, '%Y-%m-%d') AS trade_date"). Where("exchange = ? AND is_open = ? AND cal_date <= ?", "SSE", 1, tradeDate). Order("cal_date ASC"). Scan(&tradeDates).Error; err != nil { return nil, -1, err } dateIndex := -1 for i, d := range tradeDates { if d == tradeDate { dateIndex = i break } } return tradeDates, dateIndex, nil }