feat(notice): NoticeService 发送核心/场景注册/订阅过滤与站内信驱动及测试

This commit is contained in:
augushong
2026-10-12 11:13:02 +00:00
parent 05ed02db34
commit a7261d0c21
5 changed files with 773 additions and 0 deletions

View File

@@ -0,0 +1,34 @@
<?php
namespace base\common\notice;
/**
* 通知投递渠道驱动契约.
*
* notice/ 为领域子模块目录:渠道驱动与传输客户端不是 service 注册服务,
* 放 service 树将违反 ulthon-naming-convention 的 Service 后缀规范,
* 参照 base\common\event、base\common\scheme 的独立模块目录先例;
* PSR-4 base\ → extend/base 自动可载。
*
* 实现约定:
* - name() 返回渠道标识(system_notice_target.channel 的取值,如 inmail/email)
* - send() 执行真实投递,抛出异常视为投递失败(消费者据此重试/置终态)
* - 驱动不做任何 DB 写入:投递行由 NoticeService::send() 统一落库,
* 消费者(timer 异步投递)按行状态调用本契约
*/
interface NoticeChannelInterface
{
/**
* 渠道标识.
*/
public static function name(): string;
/**
* 投递一条通知.
*
* @param array $target 投递行(system_notice_target 一行,含 channel/target_addr/status 等)
* @param array $notice 通知主体(system_notice 一行)
* @return bool 是否成功;抛出异常视为失败
*/
public function send(array $target, array $notice): bool;
}

View File

@@ -0,0 +1,27 @@
<?php
namespace base\common\notice\channel;
use base\common\notice\NoticeChannelInterface;
/**
* 站内信渠道驱动.
*
* 站内信投递即落库:NoticeService::send() 写 target 行时已置 status=2(成功)、
* send_time=当前时间,数据落库即为投递完成,本驱动无需任何外部动作。
* 顶栏铃铛/我的消息按 admin_id + channel=inmail 读取行数据呈现;
* 消费者(timer 异步投递)永不消费 inmail 行(send 侧直接终态,不入队列)。
*/
class InMailChannel implements NoticeChannelInterface
{
public static function name(): string
{
return 'inmail';
}
public function send(array $target, array $notice): bool
{
// 站内信投递即落库:send() 阶段已完成写入并置成功终态,此处恒成功。
return true;
}
}