# 装修需求聊天功能分析报告

## 一、现有系统支持情况

### ✅ 已支持的功能

1. **聊天表结构（LifeMessage）**
   - 支持 `user_` + 手机号 格式（用户端）
   - 支持 `store_` + 手机号 格式（商户端）
   - 有 `businessId` 字段可关联装修需求ID
   - 支持多种消息类型（文本、图片、链接等）
   - 支持已读/未读状态管理

2. **WebSocket实时通信**
   - 已实现 WebSocket 实时消息推送
   - 消息保存时可通过 `businessId` 关联装修需求

3. **现有消息接口**
   - `/message/getMessageList` - 获取消息列表
   - `/message/getMessageListByReceiverId` - 获取聊天详情
   - `/message/getAllNoReadCount` - 获取未读消息数

## 二、需要补充的功能

### 1. 从装修需求发起聊天接口

**需求场景：**
- 装修商铺查看装修需求后，点击"联系商家"按钮发起聊天
- 商户查看装修需求后，点击"联系装修商"按钮发起聊天

**需要实现的接口：**
```
POST /renovation/startChat
参数：
  - requirementId: 装修需求ID
  - currentUserId: 当前登录用户ID（商户或装修商铺）
  
返回：
  - senderId: 发送方ID（格式：store_手机号 或 user_手机号）
  - receiverId: 接收方ID（格式：store_手机号 或 user_手机号）
  - chatInitiated: 是否首次发起聊天（用于统计咨询数）
```

**实现逻辑：**
1. 根据 requirementId 查询装修需求信息
2. 获取装修需求的联系信息（contactPhone）
3. 根据 store_id 查询装修商铺的 StoreUser，获取手机号
4. 根据 contactPhone 查询对应的用户（LifeUser 或 StoreUser）
5. 构造发送方和接收方的ID（user_ 或 store_ + 手机号）
6. 如果是首次发起聊天，更新 inquiry_count + 1
7. 返回对方ID，前端可直接跳转到聊天页面

### 2. ID格式转换逻辑

**问题：**
- `StoreRenovationRequirement.contactPhone` 存储的是普通手机号
- `StoreRenovationRequirement.store_id` 关联装修商铺
- 需要转换为聊天系统需要的格式（`user_`/`store_` + 手机号）

**解决方案：**
```java
// 1. 获取装修商铺的ID
StoreInfo storeInfo = storeInfoMapper.selectById(storeId);
StoreUser storeUser = storeUserMapper.selectOne(
    new QueryWrapper<StoreUser>().eq("store_id", storeId)
);
String renovationStoreId = "store_" + storeUser.getPhone();

// 2. 获取发布需求的商户ID
// 方式1：通过 contactPhone 查找
LifeUser lifeUser = lifeUserMapper.selectOne(
    new QueryWrapper<LifeUser>().eq("user_phone", contactPhone)
);
String merchantId = "user_" + contactPhone;

// 方式2：如果有 created_user_id，可通过 StoreUser 查找
StoreUser merchantStoreUser = storeUserMapper.selectById(createdUserId);
String merchantId = "store_" + merchantStoreUser.getPhone();
```

### 3. 消息类型扩展

**当前消息类型：**
- 1-文本
- 2-图片
- 3-链接
- 4-12: 二手交易相关
- 8: 律师消息

**建议新增：**
- 13: 装修需求咨询消息（可在消息列表显示特殊标识）
- 或直接使用 type=1（文本），通过 businessId 区分业务场景

### 4. 咨询数统计

**实现位置：**
在发起聊天时（首次聊天），更新 `inquiry_count` 字段：
```java
// 检查是否已有聊天记录
LambdaQueryWrapper<LifeMessage> wrapper = new LambdaQueryWrapper<>();
wrapper.eq(LifeMessage::getBusinessId, requirementId);
wrapper.eq(LifeMessage::getSenderId, senderId);
wrapper.eq(LifeMessage::getReceiverId, receiverId);
long chatCount = lifeMessageMapper.selectCount(wrapper);

if (chatCount == 0) {
    // 首次聊天，增加咨询数
    StoreRenovationRequirement requirement = requirementMapper.selectById(requirementId);
    requirement.setInquiryCount(requirement.getInquiryCount() + 1);
    requirementMapper.updateById(requirement);
}
```

### 5. 消息列表展示装修需求信息

**需求：**
在消息列表中，如果是装修需求相关的聊天，显示装修需求标题等信息

**实现方式：**
- 查询消息列表时，通过 `businessId` 关联查询装修需求信息
- 在 LifeMessageVo 中添加装修需求相关字段（可选）

## 三、建议实现的接口

### 1. 发起装修需求聊天接口
```
POST /renovation/startChat
```

### 2. 获取装修需求聊天信息接口
```
GET /renovation/getChatInfo/{requirementId}
返回：发送方ID、接收方ID、是否已发起过聊天等
```

### 3. WebSocket消息扩展
在发送消息时，确保 `businessId` 字段设置为装修需求ID：
```java
lifeMessage.setBusinessId(requirementId);
```

## 四、数据库字段说明

### StoreRenovationRequirement 表
- `id`: 装修需求ID（用作 businessId）
- `store_id`: 装修商铺ID（可通过此ID查询装修商铺的StoreUser获取手机号）
- `contact_phone`: 发布需求的商户手机号
- `created_user_id`: 创建用户ID（可辅助查找商户）

### LifeMessage 表
- `sender_id`: 发送方ID（user_手机号 或 store_手机号）
- `receiver_id`: 接收方ID（user_手机号 或 store_手机号）
- `business_id`: 业务ID（设置为装修需求ID）
- `type`: 消息类型（建议使用 1-文本，或新增 13-装修需求咨询）

## 五、总结

**现状：** 基础的聊天功能已完整支持，可直接使用 LifeMessage 表进行聊天。

**待补充：** 
1. 从装修需求页面发起聊天的便捷接口
2. ID格式转换逻辑（手机号 -> user_/store_ + 手机号）
3. 咨询数统计功能
4. 可选：装修需求消息类型标识

**优先级：**
- 🔴 高：发起聊天接口、ID格式转换
- 🟡 中：咨询数统计
- 🟢 低：消息类型扩展、消息列表展示装修需求信息


