# 消息系统设计说明

## 📊 数据表结构

### 1. tb_message - 消息主表
存储消息的基本信息

**主要字段：**
- `message_id` - 消息ID（主键）
- `title` - 消息标题
- `content` - 消息内容
- `type` - 消息类型
- `status` - 消息状态

### 2. tb_message_range - 消息发送范围定义表
定义消息要发送给哪些对象，通过什么渠道

**主要字段：**
- `message_id` - 消息ID
- `target_type` - 目标类型（user/dept/role/all）
- `target_id` - 目标ID（用户、部门、角色ID等）
- `channel` - 发送渠道（app/sms/email/wechat等）
- **唯一约束：** (message_id, target_type, target_id, channel)

**使用示例：**
- 发送给部门001，通过app：`{target_type: 'dept', target_id: 'D001', channel: 'app'}`
- 发送给部门001，通过sms：`{target_type: 'dept', target_id: 'D001', channel: 'sms'}`
- 发送给全员，通过app：`{target_type: 'all', target_id: null, channel: 'app'}`

### 3. tb_message_receiver - 用户消息接收记录表
记录每个用户实际收到的消息及处理状态

**主要字段：**
- `message_id` - 消息ID
- `user_id` - 用户ID
- `channel` - 接收渠道
- `status` - 消息状态（unread/read/handled/deleted）
- `read_time` - 阅读时间
- `handle_time` - 处理时间
- **唯一约束：** (message_id, user_id, channel)

**索引：**
- `idx_message_user_user_status` - 快速查询用户消息列表
- `idx_message_user_message` - 快速查询消息的接收情况

### 4. tb_message_channel - 消息渠道配置表
管理各种消息发送渠道的配置

**主要字段：**
- `channel_id` - 渠道ID（主键）
- `channel_code` - 渠道编码（app/sms/email/wechat/dingtalk）
- `channel_name` - 渠道名称
- `config` - 渠道配置（JSON格式，存储API密钥等）
- `status` - 渠道状态（enabled/disabled/maintenance）
- `priority` - 优先级

**预置渠道：**
- app - 应用内消息（已启用）
- sms - 短信通知（已禁用）
- email - 邮件通知（已禁用）
- wechat - 微信通知（已禁用）
- dingtalk - 钉钉通知（已禁用）

## 📦 DTO/VO 结构

### TbMessageDTO
消息基本信息DTO

**字段：**
- messageId
- title
- content
- type
- status

### TbMessageRangeDTO
消息发送范围DTO

**字段：**
- messageId
- targetType - 目标类型
- targetId - 目标ID
- channel - 发送渠道

### TbMessageReceiverDTO
用户消息接收记录DTO

**字段：**
- messageId
- userId
- channel
- status
- readTime
- handleTime

### TbMessageChannelDTO
消息渠道配置DTO

**字段：**
- channelId
- channelCode
- channelName
- channelDesc
- config
- status
- priority

### MessageVO
消息视图对象（用于创建和查看消息）

**字段：**
- messageId
- title
- content
- type
- status
- createTime
- creator
- messageRanges - 消息发送范围列表
- messageReceivers - 消息接收记录列表（管理员查看时使用）

## 🔄 业务流程

### 1. 创建并发送消息

```java
// 创建消息
MessageVO messageVO = new MessageVO();
messageVO.setTitle("系统维护通知");
messageVO.setContent("系统将于今晚22:00进行维护");
messageVO.setType("notice");

// 定义发送范围（发给IT部门，通过app和email）
List<TbMessageRangeDTO> ranges = new ArrayList<>();
ranges.add(new TbMessageRangeDTO() {{
    setTargetType("dept");
    setTargetId("DEPT_IT");
    setChannel("app");
}});
ranges.add(new TbMessageRangeDTO() {{
    setTargetType("dept");
    setTargetId("DEPT_IT");
    setChannel("email");
}});
messageVO.setMessageRanges(ranges);

// 发送消息
messageService.sendMessage(messageVO);
```

**系统处理：**
1. 在 `tb_message` 中创建消息记录
2. 在 `tb_message_range` 中保存发送范围
3. 根据 `target_type` 和 `target_id` 查询具体用户列表
4. 在 `tb_message_receiver` 中为每个用户创建接收记录
5. 根据 `channel` 调用相应的渠道服务发送消息

### 2. 用户查看消息列表

```sql
-- 查询用户未读消息
SELECT m.*, r.status, r.read_time, r.channel
FROM message.tb_message m
JOIN message.tb_message_receiver r ON m.message_id = r.message_id
WHERE r.user_id = 'USER_001' 
  AND r.status = 'unread'
  AND r.deleted = false
ORDER BY m.create_time DESC;
```

### 3. 用户处理消息

```java
// 标记消息为已读
messageService.handleMessage(messageId, "read");

// 标记消息为已处理
messageService.handleMessage(messageId, "handled");
```

**系统处理：**
- 更新 `tb_message_receiver` 表的 `status` 字段
- 根据状态更新 `read_time` 或 `handle_time`

### 4. 管理员查看消息统计

```sql
-- 查询某条消息的发送统计
SELECT 
    r.channel,
    r.status,
    COUNT(*) as count
FROM message.tb_message_receiver r
WHERE r.message_id = 'MSG_001'
  AND r.deleted = false
GROUP BY r.channel, r.status;
```

## 🎯 设计优势

1. **职责分离**
   - `tb_message_range` - 定义发送规则
   - `tb_message_receiver` - 记录实际接收情况

2. **多渠道支持**
   - 同一消息可通过多个渠道发送
   - 渠道配置独立管理
   - 易于扩展新渠道

3. **灵活的目标定义**
   - 支持按用户、部门、角色、全员发送
   - 同一目标可使用不同渠道

4. **完整的状态跟踪**
   - 记录阅读时间、处理时间
   - 支持已读/未读/已处理/已删除等状态

5. **性能优化**
   - 合理的索引设计
   - 支持高效的用户消息查询

## 📝 注意事项

1. **数据一致性**
   - 发送消息时，确保 `tb_message_range` 和 `tb_message_receiver` 的事务一致性

2. **渠道验证**
   - 发送前检查 `tb_message_channel` 中渠道是否启用
   - 根据 `priority` 选择备用渠道

3. **性能考虑**
   - 全员消息（target_type='all'）需要异步处理
   - 大量用户时分批创建 `tb_message_receiver` 记录

4. **软删除**
   - 所有表都使用软删除（deleted字段）
   - 查询时注意添加 `WHERE deleted = false` 条件

