Files
go/internal/service/limit_board_service.go
2026-05-09 17:50:40 +08:00

66 lines
1.5 KiB
Go

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
}