分布式微服务系统架构第154集:JavaPlus技术文档平台日更-powerbank-iot-service

6 阅读7分钟

加群联系作者vx:xiaoda0423

仓库地址:webvueblog.github.io/JavaPlusDoc…

1024bat.cn/

github.com/webVueBlog/…

webvueblog.github.io/JavaPlusDoc…

点击勘误issues,哪吒感谢大家的阅读

# 充电宝租借归还功能设计文档

## 1. 功能概述

本文档详细描述充电宝租借和归还功能的完整实现方案,包括数据库设计、业务流程、API接口和技术实现。

### 1.1 主要功能
- 用户扫码借出充电宝
- 用户扫码归还充电宝
- 费用计算和支付
- 押金管理
- 超时处理
- 设备状态管理
- 用户信用管理

## 2. 数据库设计

### 2.1 用户表 (tb_user)

```sql
CREATE TABLE tb_user (
    id BIGINT PRIMARY KEY AUTO_INCREMENT COMMENT '主键ID',
    user_id VARCHAR(32) UNIQUE NOT NULL COMMENT '用户ID',
    username VARCHAR(50) COMMENT '用户名',
    phone VARCHAR(20) UNIQUE COMMENT '手机号',
    email VARCHAR(100) UNIQUE COMMENT '邮箱',
    avatar_url VARCHAR(500) COMMENT '头像URL',
    status ENUM('ACTIVE', 'SUSPENDED', 'BLOCKED') DEFAULT 'ACTIVE' COMMENT '用户状态',
    credit_score INT DEFAULT 100 COMMENT '信用分数',
    balance DECIMAL(10,2) DEFAULT 0.00 COMMENT '账户余额',
    deposit DECIMAL(10,2) DEFAULT 0.00 COMMENT '押金',
    is_real_name_verified BOOLEAN DEFAULT FALSE COMMENT '是否实名认证',
    real_name VARCHAR(50) COMMENT '真实姓名',
    id_card VARCHAR(20) COMMENT '身份证号',
    registration_time DATETIME COMMENT '注册时间',
    last_login_time DATETIME COMMENT '最后登录时间',
    created_at DATETIME DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
    updated_at DATETIME DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间',
    
    INDEX idx_phone (phone),
    INDEX idx_email (email),
    INDEX idx_status (status)
) COMMENT='用户表';
```

### 2.2 租借记录表 (tb_rental_record)

```sql
CREATE TABLE tb_rental_record (
    id BIGINT PRIMARY KEY AUTO_INCREMENT COMMENT '主键ID',
    rental_id VARCHAR(32) UNIQUE NOT NULL COMMENT '租借ID',
    user_id VARCHAR(32) NOT NULL COMMENT '用户ID',
    device_id VARCHAR(32) NOT NULL COMMENT '设备ID',
    power_bank_id BIGINT NOT NULL COMMENT '充电宝ID',
    rental_status ENUM('RENTING', 'RETURNED', 'LOST', 'DAMAGED', 'CANCELLED') NOT NULL COMMENT '租借状态',
    rental_time DATETIME NOT NULL COMMENT '租借时间',
    return_time DATETIME COMMENT '归还时间',
    rental_duration BIGINT COMMENT '租借时长(分钟)',
    rental_longitude DECIMAL(10,7) COMMENT '租借位置经度',
    rental_latitude DECIMAL(10,7) COMMENT '租借位置纬度',
    return_longitude DECIMAL(10,7) COMMENT '归还位置经度',
    return_latitude DECIMAL(10,7) COMMENT '归还位置纬度',
    rental_battery_level INT COMMENT '租借时电量',
    return_battery_level INT COMMENT '归还时电量',
    fee_amount DECIMAL(10,2) DEFAULT 0.00 COMMENT '费用金额',
    deposit_amount DECIMAL(10,2) DEFAULT 0.00 COMMENT '押金金额',
    payment_status ENUM('UNPAID', 'PAID', 'REFUNDED', 'FAILED') DEFAULT 'UNPAID' COMMENT '支付状态',
    payment_method VARCHAR(20) COMMENT '支付方式',
    payment_time DATETIME COMMENT '支付时间',
    is_overtime BOOLEAN DEFAULT FALSE COMMENT '是否超时',
    overtime_fee DECIMAL(10,2) DEFAULT 0.00 COMMENT '超时费用',
    remark TEXT COMMENT '备注',
    created_at DATETIME DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
    updated_at DATETIME DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间',
    
    INDEX idx_user_id (user_id),
    INDEX idx_device_id (device_id),
    INDEX idx_rental_status (rental_status),
    INDEX idx_rental_time (rental_time),
    INDEX idx_return_time (return_time)
) COMMENT='租借记录表';
```

### 2.3 二维码表 (tb_qr_code)

```sql
CREATE TABLE tb_qr_code (
    id BIGINT PRIMARY KEY AUTO_INCREMENT COMMENT '主键ID',
    device_id VARCHAR(32) NOT NULL COMMENT '设备ID',
    qr_code VARCHAR(500) UNIQUE NOT NULL COMMENT '二维码内容',
    qr_type ENUM('RENTAL', 'RETURN', 'MAINTENANCE') NOT NULL COMMENT '二维码类型',
    qr_status ENUM('ACTIVE', 'INACTIVE', 'EXPIRED', 'USED') DEFAULT 'ACTIVE' COMMENT '二维码状态',
    image_url VARCHAR(500) COMMENT '二维码图片URL',
    generation_time DATETIME DEFAULT CURRENT_TIMESTAMP COMMENT '生成时间',
    expiration_time DATETIME COMMENT '过期时间',
    last_scan_time DATETIME COMMENT '最后扫描时间',
    scan_count INT DEFAULT 0 COMMENT '扫描次数',
    version INT DEFAULT 1 COMMENT '版本号',
    enabled BOOLEAN DEFAULT TRUE COMMENT '是否启用',
    remark TEXT COMMENT '备注',
    created_at DATETIME DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
    updated_at DATETIME DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间',
    
    UNIQUE KEY uk_device_qr (device_id, qr_code),
    INDEX idx_qr_status (qr_status),
    INDEX idx_qr_type (qr_type),
    INDEX idx_expiration_time (expiration_time)
) COMMENT='二维码表';
```

## 3. 业务流程设计

### 3.1 充电宝借出流程

```mermaid
sequenceDiagram
    participant User as 用户
    participant App as 移动应用
    participant API as 后端API
    participant DB as 数据库
    participant Device as 设备
    
    User->>App: 扫描设备二维码
    App->>API: 发送扫码借出请求
    API->>DB: 验证二维码有效性
    API->>DB: 检查用户状态和余额
    API->>DB: 检查设备和充电宝状态
    API->>DB: 冻结押金
    API->>DB: 创建租借记录
    API->>Device: 发送开锁指令
    Device-->>API: 返回开锁结果
    API->>DB: 更新设备和充电宝状态
    API-->>App: 返回借出成功
    App-->>User: 显示借出成功信息
```

#### 3.1.1 详细步骤

1. **扫码验证**
   - 用户扫描设备上的二维码
   - 系统验证二维码的有效性(未过期、状态正常)
   - 解析二维码获取设备信息

2. **用户验证**
   - 检查用户状态(是否被封禁、暂停)
   - 验证用户是否已实名认证
   - 检查用户信用分数是否满足要求
   - 验证用户账户余额是否充足

3. **设备检查**
   - 检查设备是否在线
   - 验证设备状态是否正常
   - 检查是否有可用的充电宝
   - 获取充电宝电量信息

4. **押金处理**
   - 根据用户信用分数计算押金金额
   - 冻结用户账户中的押金
   - 记录押金冻结信息

5. **创建租借记录**
   - 生成唯一的租借ID
   - 记录租借时间、位置、电量等信息
   - 设置租借状态为"RENTING"

6. **设备控制**
   - 向设备发送开锁指令
   - 等待设备响应
   - 更新充电宝状态为"RENTED"

### 3.2 充电宝归还流程

```mermaid
sequenceDiagram
    participant User as 用户
    participant App as 移动应用
    participant API as 后端API
    participant DB as 数据库
    participant Device as 设备
    
    User->>App: 扫描归还设备二维码
    App->>API: 发送扫码归还请求
    API->>DB: 验证二维码和租借记录
    API->>DB: 检查设备状态
    API->>Device: 检查充电宝插入状态
    Device-->>API: 返回插入确认
    API->>DB: 计算租借费用
    API->>DB: 处理费用扣除
    API->>DB: 解冻押金
    API->>DB: 更新租借记录
    API->>DB: 更新设备和充电宝状态
    API-->>App: 返回归还成功
    App-->>User: 显示费用明细
```

#### 3.2.1 详细步骤

1. **扫码验证**
   - 用户扫描归还设备的二维码
   - 验证二维码有效性
   - 检查设备是否支持归还

2. **租借记录验证**
   - 根据用户ID查找正在进行的租借记录
   - 验证租借状态
   - 检查是否超时

3. **设备检查**
   - 验证归还设备状态
   - 检查设备是否有空余插槽
   - 确认充电宝已正确插入

4. **费用计算**
   - 计算租借时长
   - 根据计费规则计算基础费用
   - 计算超时费用(如有)
   - 应用优惠券或折扣(如有)

5. **费用处理**
   - 从用户账户扣除费用
   - 解冻押金
   - 记录支付信息

6. **更新记录**
   - 更新租借记录状态为"RETURNED"
   - 记录归还时间、位置、电量
   - 更新充电宝状态为"AVAILABLE"

## 4. API接口设计

### 4.1 租借相关接口

#### 4.1.1 扫码借出
```http
POST /api/rentals/scan-rent
Content-Type: application/json

{
    "qrCode": "设备二维码内容",
    "userId": "用户ID",
    "longitude": 116.397128,
    "latitude": 39.916527
}
```

**响应示例:**
```json
{
    "code": 200,
    "message": "借出成功",
    "data": {
        "rentalId": "R202312010001",
        "deviceId": "DEV001",
        "powerBankId": 1001,
        "batteryLevel": 85,
        "depositAmount": 99.00,
        "rentalTime": "2023-12-01T10:30:00"
    }
}
```

#### 4.1.2 扫码归还
```http
POST /api/rentals/scan-return
Content-Type: application/json

{
    "qrCode": "设备二维码内容",
    "userId": "用户ID",
    "longitude": 116.397128,
    "latitude": 39.916527
}
```

**响应示例:**
```json
{
    "code": 200,
    "message": "归还成功",
    "data": {
        "rentalId": "R202312010001",
        "duration": 120,
        "feeAmount": 6.00,
        "depositRefund": 99.00,
        "returnTime": "2023-12-01T12:30:00",
        "batteryLevel": 45
    }
}
```

### 4.2 费用计算接口

#### 4.2.1 计算租借费用
```http
POST /api/rentals/{rentalId}/calculate-fee
```

**响应示例:**
```json
{
    "code": 200,
    "message": "计算成功",
    "data": {
        "baseFee": 5.00,
        "overtimeFee": 1.00,
        "totalFee": 6.00,
        "duration": 120,
        "isOvertime": true
    }
}
```

## 5. 计费规则

### 5.1 基础计费
-30分钟免费
- 30分钟后每30分钟收费2- 不足30分钟按30分钟计算

### 5.2 押金规则
- 信用分数≥90分:免押金
- 信用分数70-89分:押金50- 信用分数<70分:押金99元

### 5.3 超时处理
- 租借超过24小时视为超时
- 超时费用:每小时10- 超时超过72小时视为丢失,扣除押金

## 6. 异常处理

### 6.1 常见异常情况

1. **设备离线**
   - 提示用户设备暂时不可用
   - 引导用户寻找附近其他设备

2. **充电宝已借完**
   - 提示设备无可用充电宝
   - 推荐附近有库存的设备

3. **用户余额不足**
   - 提示用户充值
   - 提供充值入口

4. **用户信用分数过低**
   - 提示用户信用分数不足
   - 说明提升信用分数的方法

5. **归还设备故障**
   - 记录异常情况
   - 人工客服介入处理

### 6.2 数据一致性保证

1. **事务处理**
   - 使用数据库事务确保操作原子性
   - 关键操作使用分布式锁

2. **状态同步**
   - 定期同步设备状态
   - 异常情况下的状态修复机制

3. **补偿机制**
   - 支付失败的重试机制
   - 押金异常的人工处理流程

## 7. 监控和运维

### 7.1 关键指标监控

- 设备在线率
- 充电宝利用率
- 用户借还成功率
- 平均租借时长
- 收入统计

### 7.2 告警机制

- 设备离线告警
- 充电宝电量低告警
- 异常交易告警
- 系统性能告警

## 8. 安全考虑

### 8.1 数据安全

- 用户敏感信息加密存储
- API接口鉴权
- 数据传输加密

### 8.2 业务安全

- 防刷机制
- 异常行为检测
- 风控规则引擎

## 9. 扩展功能

### 9.1 会员体系

- VIP用户优惠
- 积分兑换
- 等级特权

### 9.2 营销功能

- 优惠券系统
- 推荐奖励
- 活动促销

### 9.3 数据分析

- 用户行为分析
- 设备使用分析
- 收入分析报表

## 10. 部署和配置

### 10.1 环境要求

- Java 8+
- MySQL 8.0+
- Redis 6.0+
- Maven 3.6+