# 站内通知当前行为 ## Purpose 描述管理端与个人客户站内通知的当前可观察行为。 ## Requirements ### Requirement: 通知接收人隔离 系统 SHALL 只向当前后台账号或个人客户返回其自身且未过期的通知、未读数量和受控目标;其他接收人的通知按不可见处理。 #### Scenario: 读取其他接收人的通知 - **GIVEN** 通知属于另一后台账号或个人客户 - **WHEN** 当前接收人查询通知、目标或请求标记已读 - **THEN** 系统不返回通知内容且不改变其已读状态 ### Requirement: 通知已读幂等 系统 SHALL 仅首次把当前接收人的未过期未读通知标记为已读并记录读取时间;重复单条或批量已读不重复改变事实。 #### Scenario: 重复标记已读 - **GIVEN** 当前接收人的通知已经标记为已读 - **WHEN** 再次执行单条或批量已读 - **THEN** 通知保持原读取事实且不影响其他接收人的通知 ### Requirement: 主钱包低余额跨阈值提醒 系统 SHALL 在店铺主钱包余额由不低于 100 元变为低于 100 元时,与扣款事实在同一事务创建面向当时有效业务员的低余额通知事件;余额持续低于 100 元时不得重复创建,余额恢复至不低于 100 元后再次跌破时 MUST 再次创建。 #### Scenario: 首次跌破阈值 - **WHEN** 店铺主钱包扣款后余额从不低于 100 元变为低于 100 元,且存在有效业务员 - **THEN** 系统在提交扣款事实时创建一条低余额通知事件,并由通知投递流程生成站内通知 #### Scenario: 持续低余额 - **WHEN** 店铺主钱包余额已经低于 100 元且再次发生扣款 - **THEN** 系统不创建新的低余额通知事件 #### Scenario: 回升后再次跌破 - **WHEN** 店铺主钱包余额已恢复至不低于 100 元,随后扣款使其低于 100 元 - **THEN** 系统创建新的低余额通知事件 ### Requirement: 套餐临期每日站内提醒 系统 SHALL 在每日扫描时,向最终到期时间可精确推算且剩余 0 至 15 个上海自然日的资产所属店铺后台接收人及其有效个人客户接收人创建套餐临期站内通知。系统 MUST 对同一资产、同一最终到期日期、同一剩余天数和同一接收人保持幂等。 #### Scenario: 临期窗口内连续两日提醒 - **GIVEN** 一项资产的最终到期时间可精确推算,昨天剩余 3 个上海自然日,今天剩余 2 个上海自然日,且两日均有有效接收人 - **WHEN** 每日临期扫描分别执行 - **THEN** 系统分别创建昨天和今天的套餐临期通知 #### Scenario: 不在临期窗口的资产 - **GIVEN** 一项资产剩余超过 15 个上海自然日、已经到期或最终到期时间不可精确推算 - **WHEN** 每日临期扫描执行 - **THEN** 系统不为该资产创建套餐临期通知 ## 可达操作索引 本节只用于入口导航,不是行为 Requirement;业务义务以上述 Requirements 为准。 ### 站内通知 `GET /api/admin/notifications`(查询通知列表);`PUT /api/admin/notifications/{id}/read`(标记单条通知已读);`GET /api/admin/notifications/{id}/target`(解析通知受控目标);`PUT /api/admin/notifications/read-all`(批量标记通知已读);`GET /api/admin/notifications/unread-count`(查询通知未读数);`GET /api/admin/notifications/unread-summary`(查询通知未读分类汇总)。 ### 个人客户 - 站内通知 `GET /api/c/v1/notifications`(查询个人客户通知列表);`PUT /api/c/v1/notifications/{id}/read`(标记个人客户单条通知已读);`PUT /api/c/v1/notifications/read-all`(全部标记个人客户通知已读);`GET /api/c/v1/notifications/unread-count`(查询个人客户通知未读数)。