## ADDED Requirements ### Requirement: 最优时段计算 系统 SHALL 基于 `AnalyticsService` 的 `time_weights` 数据计算每个 3 小时段的权重得分,并按得分降序排列为候选时段列表。 #### Scenario: 有分析数据时按权重排序 - **WHEN** `time_weights` 包含至少 1 个时段的权重数据 - **THEN** `suggest_schedule_time()` SHALL 按 `weight` 值降序排列时段,优先返回高权重时段的具体时间 #### Scenario: 无分析数据时使用默认时段 - **WHEN** `time_weights` 为空字典或不存在 - **THEN** 系统 SHALL 使用默认的高流量时段作为候选:08-11 时(权重 70)、12-14 时(权重 60)、18-21 时(权重 85)、21-24 时(权重 75) ### Requirement: 时段冲突检测 系统 SHALL 在分配排期时间前查询已有队列排期,避免同一时段内容拥堵。 #### Scenario: 单时段内容上限控制 - **WHEN** 某个 3 小时时段中已排期的队列项数量达到 `max_per_slot`(默认 2) - **THEN** 系统 SHALL 跳过该时段,选择下一个权重最高且有空余的时段 #### Scenario: 单日内容上限控制 - **WHEN** 某天的已排期总数达到 `max_per_day`(默认 5) - **THEN** 系统 SHALL 将内容排期到次日的最优可用时段 #### Scenario: 最远排期范围 - **WHEN** 未来 7 天内所有时段均已满 - **THEN** `suggest_schedule_time()` SHALL 返回 `None`,内容以 approved 状态入队(不带排期时间) ### Requirement: 排期时间精确化 系统 SHALL 在选定的 3 小时段内随机选择一个精确的分钟级时间点,避免所有内容在整点发布。 #### Scenario: 时段内随机时间 - **WHEN** 系统选定 18-21 时段为最优 - **THEN** SHALL 在该时段范围内随机生成精确时间(如 `2026-02-28 19:37:00`),格式为 `%Y-%m-%d %H:%M:%S` ### Requirement: 队列项自动排期 `PublishQueue` SHALL 提供 `auto_schedule_item(item_id, analytics)` 方法,为指定队列项调用排期引擎并更新其 `scheduled_time`。 #### Scenario: 自动排期成功 - **WHEN** 调用 `auto_schedule_item(item_id, analytics)` 且队列项状态为 draft 或 approved - **THEN** 系统 SHALL 计算最优时间并更新该项的 `scheduled_time` 和状态为 `scheduled` #### Scenario: 自动排期无可用时段 - **WHEN** 调用 `auto_schedule_item()` 但未来 7 天无可用时段 - **THEN** 系统 SHALL 保持队列项当前状态不变,返回 `False`