66 "encoding/json"
77 "fmt"
88 "io"
9+ "math/rand"
910 "net/http"
1011 "slices"
1112 "strconv"
@@ -1087,6 +1088,54 @@ func GenerateSummary(c *fiber.Ctx) error {
10871088 if err != nil {
10881089 return err
10891090 }
1091+
1092+ if len (floors ) > config .Config .MaxSummaryFloors {
1093+ // 1. 按 UpdatedAt 升序排序
1094+ slices .SortFunc (floors , func (a , b * Floor ) int {
1095+ if a .UpdatedAt .Equal (b .UpdatedAt ) {
1096+ return 0
1097+ }
1098+ if a .UpdatedAt .Before (b .UpdatedAt ) {
1099+ return - 1
1100+ }
1101+ return 1
1102+ })
1103+
1104+ // 2. 提取头尾
1105+ earliestFloors := config .Config .MaxSummaryFloors / 5
1106+ newestFloors := config .Config .MaxSummaryFloors / 5 * 2
1107+ earliest := floors [:earliestFloors ]
1108+ newest := floors [len (floors )- newestFloors :]
1109+
1110+ // 3. 提取中间并按 Like 降序筛选
1111+ middle := make (Floors , len (floors )- earliestFloors - newestFloors )
1112+ copy (middle , floors [earliestFloors :len (floors )- newestFloors ]) // copy 防止影响原切片顺序
1113+
1114+ rand .Shuffle (len (middle ), func (i , j int ) {
1115+ middle [i ], middle [j ] = middle [j ], middle [i ]
1116+ })
1117+
1118+ slices .SortFunc (middle , func (a , b * Floor ) int {
1119+ return b .Like - a .Like
1120+ })
1121+
1122+ // 4.即使中间不足20条也能安全截取 (len(floors)>50 保证了 middle 长度至少为 21)
1123+ topLikes := middle [:config .Config .MaxSummaryFloors - earliestFloors - newestFloors ]
1124+
1125+ // 5. 合并
1126+ newFloors := make (Floors , 0 , config .Config .MaxSummaryFloors )
1127+ newFloors = append (newFloors , earliest ... )
1128+ newFloors = append (newFloors , topLikes ... )
1129+ newFloors = append (newFloors , newest ... )
1130+
1131+ floors = newFloors
1132+
1133+ // 6. 按 ID 重新排序以恢复对话流上下文
1134+ slices .SortFunc (floors , func (a , b * Floor ) int {
1135+ return a .Ranking - b .Ranking
1136+ })
1137+ }
1138+
10901139 content := ""
10911140 if hole .HoleFloor .FirstFloor != nil {
10921141 content = hole .HoleFloor .FirstFloor .Content
@@ -1105,7 +1154,6 @@ func GenerateSummary(c *fiber.Ctx) error {
11051154 FloorID : floor .FloorID ,
11061155 }
11071156 }
1108-
11091157 requestBody := map [string ]any {
11101158 "floors" : summaryFloors ,
11111159 "content" : content ,
0 commit comments