96 lines
2.8 KiB
Go
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

package weekstar
import (
"fmt"
"strings"
"time"
"chatapp3-golang/internal/model"
)
// referenceTimeForPage 返回页面应参考的周期时间点,未开始取 startAt已结束取结束前一秒。
func (s *WeekStarService) referenceTimeForPage(configRow *model.WeekStarActivityConfig, now time.Time) time.Time {
if configRow == nil {
return now
}
startAt := s.fromStorageWallClock(configRow.StartAt)
endAt := s.fromStorageWallClock(configRow.EndAt)
switch {
case now.Before(startAt):
return startAt
case !now.Before(endAt):
return endAt.Add(-time.Second)
default:
return now
}
}
// cycleBounds 返回某个时间所在周的起止边界。
func (s *WeekStarService) cycleBounds(t time.Time) (time.Time, time.Time) {
start := s.cycleStart(t)
return start, start.AddDate(0, 0, 7)
}
// cycleStart 计算某个时间所在周的周一 00:00作为周榜周期起点。
func (s *WeekStarService) cycleStart(t time.Time) time.Time {
local := t.In(s.location)
weekday := int(local.Weekday())
if weekday == 0 {
weekday = 7
}
startDay := local.AddDate(0, 0, -(weekday - 1))
return time.Date(startDay.Year(), startDay.Month(), startDay.Day(), 0, 0, 0, 0, s.location)
}
// cycleKey 把周期开始时间格式化为稳定的周期标识,例如 20260414。
func (s *WeekStarService) cycleKey(start time.Time) string {
return start.In(s.location).Format("20060102")
}
// toStorageWallClock 把活动时区时间转换为数据库约定的墙上时间存储格式。
func (s *WeekStarService) toStorageWallClock(t time.Time) time.Time {
local := t.In(s.location)
return time.Date(
local.Year(),
local.Month(),
local.Day(),
local.Hour(),
local.Minute(),
local.Second(),
local.Nanosecond(),
s.location,
)
}
// fromStorageWallClock 把数据库里的墙上时间恢复到活动时区,便于业务计算和展示。
func (s *WeekStarService) fromStorageWallClock(t time.Time) time.Time {
return time.Date(
t.Year(),
t.Month(),
t.Day(),
t.Hour(),
t.Minute(),
t.Second(),
t.Nanosecond(),
s.location,
)
}
// rankRedisKey 返回某个活动某个周期的实时排行 Redis Key。
func (s *WeekStarService) rankRedisKey(configID int64, cycleKey string) string {
return fmt.Sprintf("week-star:rank:%d:%s", configID, cycleKey)
}
// settleLockKey 返回某个活动某个周期的结算锁 Redis Key。
func (s *WeekStarService) settleLockKey(configID int64, cycleKey string) string {
return fmt.Sprintf("week-star:settle-lock:%d:%s", configID, cycleKey)
}
// normalizeSysOrigin 兜底系统标识为空时使用默认系统,并统一转成大写。
func (s *WeekStarService) normalizeSysOrigin(sysOrigin string) string {
if strings.TrimSpace(sysOrigin) == "" {
return strings.ToUpper(strings.TrimSpace(s.cfg.WeekStar.DefaultSysOrigin))
}
return strings.ToUpper(strings.TrimSpace(sysOrigin))
}