fujian_water_biz_doc/water_biz_interface_design.md

476 lines
11 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

# 福建水务营收系统接口设计
## 一、接口设计概述
福建水务营收系统采用RESTful风格设计API接口通过HTTP协议提供服务。系统接口分为内部模块间接口和外部系统集成接口两大类遵循统一的接口规范和安全策略。
## 二、接口设计原则
### 1. 设计原则
- **RESTful风格**: 接口遵循REST架构风格
- **版本控制**: 在URL中包含版本信息
- **统一响应**: 统一的响应格式和状态码
- **参数校验**: 严格的参数校验确保数据有效性
- **权限控制**: 基于JWT和RBAC的接口权限控制
- **幂等性**: 确保关键操作的幂等性
- **文档完善**: 详细的接口文档说明
### 2. 接口地址规范
```
https://{domain}/api/v{version}/{module}/{resource}/{action}
```
- **domain**: 系统域名
- **version**: 接口版本号如v1
- **module**: 功能模块如user、meter
- **resource**: 资源名称,通常为复数形式
- **action**: 可选的操作名称
### 3. 响应格式规范
所有接口统一返回JSON格式数据基本结构如下
```json
{
"code": 0, // 状态码0表示成功非0表示失败
"msg": "success", // 状态描述
"data": { // 响应数据可能是对象、数组或null
// 具体的业务数据
},
"timestamp": 1621234567890 // 响应时间戳
}
```
### 4. 状态码规范
| 状态码 | 说明 |
|-------|------|
| 0 | 成功 |
| 1000-1999 | 用户认证相关错误 |
| 2000-2999 | 权限相关错误 |
| 3000-3999 | 参数相关错误 |
| 4000-4999 | 业务相关错误 |
| 5000-5999 | 系统内部错误 |
## 三、内部模块接口
### 1. 用户认证模块接口
#### 1.1 用户登录
- **接口地址**: `/api/v1/auth/login`
- **请求方式**: POST
- **接口描述**: 用户登录认证接口
- **请求参数**:
| 参数名 | 类型 | 是否必填 | 说明 |
|-------|------|---------|-----|
| username | String | 是 | 用户名 |
| password | String | 是 | 密码 |
| captcha | String | 否 | 验证码 |
| captchaId | String | 否 | 验证码ID |
- **响应示例**:
```json
{
"code": 0,
"msg": "success",
"data": {
"token": "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9...",
"refreshToken": "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9...",
"expireTime": 1621234567890,
"userInfo": {
"userId": 1,
"username": "admin",
"nickname": "管理员",
"avatar": "https://example.com/avatar.jpg",
"permissions": ["sys:user:list", "sys:user:create"]
}
},
"timestamp": 1621234567890
}
```
#### 1.2 刷新令牌
- **接口地址**: `/api/v1/auth/refresh-token`
- **请求方式**: POST
- **接口描述**: 刷新访问令牌
- **请求参数**:
| 参数名 | 类型 | 是否必填 | 说明 |
|-------|------|---------|-----|
| refreshToken | String | 是 | 刷新令牌 |
- **响应示例**:
```json
{
"code": 0,
"msg": "success",
"data": {
"token": "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9...",
"expireTime": 1621234567890
},
"timestamp": 1621234567890
}
```
### 2. 水表管理模块接口
#### 2.1 水表列表查询
- **接口地址**: `/api/v1/meter/meters`
- **请求方式**: GET
- **接口描述**: 查询水表信息列表
- **请求参数**:
| 参数名 | 类型 | 是否必填 | 说明 |
|-------|------|---------|-----|
| customerId | Long | 否 | 客户ID |
| meterNo | String | 否 | 水表编号 |
| meterType | Integer | 否 | 水表类型 |
| status | Integer | 否 | 水表状态 |
| pageNo | Integer | 否 | 页码默认1 |
| pageSize | Integer | 否 | 每页记录数默认10 |
- **响应示例**:
```json
{
"code": 0,
"msg": "success",
"data": {
"total": 100,
"list": [
{
"id": 1,
"meterNo": "M20230001",
"customerName": "张三",
"meterType": 1,
"meterTypeName": "普通水表",
"installAddress": "福建省福州市台江区",
"currentReading": 120.5,
"status": 0,
"statusName": "正常"
}
],
"pageNum": 1,
"pageSize": 10,
"totalPages": 10
},
"timestamp": 1621234567890
}
```
#### 2.2 水表详情查询
- **接口地址**: `/api/v1/meter/meters/{id}`
- **请求方式**: GET
- **接口描述**: 查询水表详细信息
- **路径参数**:
| 参数名 | 类型 | 是否必填 | 说明 |
|-------|------|---------|-----|
| id | Long | 是 | 水表ID |
- **响应示例**:
```json
{
"code": 0,
"msg": "success",
"data": {
"id": 1,
"meterNo": "M20230001",
"customerId": 1,
"customerName": "张三",
"meterType": 1,
"meterTypeName": "普通水表",
"caliber": "DN20",
"installDate": "2023-01-15",
"initialReading": 0,
"currentReading": 120.5,
"installAddress": "福建省福州市台江区",
"status": 0,
"statusName": "正常",
"readingCycle": 1,
"readingCycleName": "月",
"description": "安装在一楼进水口",
"createTime": "2023-01-15 10:00:00",
"updateTime": "2023-05-10 15:30:00"
},
"timestamp": 1621234567890
}
```
### 3. 抄表管理模块接口
#### 3.1 提交抄表数据
- **接口地址**: `/api/v1/reading/meter-readings`
- **请求方式**: POST
- **接口描述**: 提交水表读数
- **请求参数**:
| 参数名 | 类型 | 是否必填 | 说明 |
|-------|------|---------|-----|
| meterId | Long | 是 | 水表ID |
| reading | Decimal | 是 | 本次读数 |
| readingDate | Date | 是 | 抄表日期 |
| readingType | Integer | 是 | 抄表类型(1人工,2远传,3用户自报) |
| photoUrl | String | 否 | 水表照片URL |
| remark | String | 否 | 备注 |
- **响应示例**:
```json
{
"code": 0,
"msg": "success",
"data": {
"id": 1,
"meterId": 1,
"meterNo": "M20230001",
"readingDate": "2023-05-10",
"reading": 120.5,
"lastReading": 100.0,
"waterUsage": 20.5,
"readingType": 1,
"readingTypeName": "人工抄表",
"status": 0,
"statusName": "正常"
},
"timestamp": 1621234567890
}
```
### 4. 收费管理模块接口
#### 4.1 生成水费账单
- **接口地址**: `/api/v1/billing/generate-bills`
- **请求方式**: POST
- **接口描述**: 根据抄表数据生成水费账单
- **请求参数**:
| 参数名 | 类型 | 是否必填 | 说明 |
|-------|------|---------|-----|
| meterReadingIds | Array | 是 | 抄表记录ID数组 |
| billingPeriod | String | 是 | 账单周期(yyyyMM) |
| dueDate | Date | 是 | 缴费截止日期 |
- **响应示例**:
```json
{
"code": 0,
"msg": "success",
"data": {
"successCount": 10,
"failCount": 0,
"billIds": [1, 2, 3]
},
"timestamp": 1621234567890
}
```
#### 4.2 缴费处理
- **接口地址**: `/api/v1/payment/payments`
- **请求方式**: POST
- **接口描述**: 处理用户缴费
- **请求参数**:
| 参数名 | 类型 | 是否必填 | 说明 |
|-------|------|---------|-----|
| billId | Long | 是 | 账单ID |
| paymentAmount | Decimal | 是 | 支付金额 |
| paymentMethod | Integer | 是 | 支付方式(1现金,2银行卡,3微信,4支付宝) |
| paymentDate | Date | 是 | 支付日期 |
| transactionNo | String | 否 | 交易流水号 |
| remark | String | 否 | 备注 |
- **响应示例**:
```json
{
"code": 0,
"msg": "success",
"data": {
"id": 1,
"billId": 1,
"billNo": "B20230510001",
"customerName": "张三",
"paymentAmount": 100.0,
"paymentMethod": 1,
"paymentMethodName": "现金",
"paymentDate": "2023-05-10",
"receiptNo": "R20230510001"
},
"timestamp": 1621234567890
}
```
## 四、外部系统接口
### 1. 银行支付接口
#### 1.1 银行代扣申请
- **接口地址**: `/api/v1/external/bank/deduction`
- **请求方式**: POST
- **接口描述**: 向银行发起代扣申请
- **请求参数**:
| 参数名 | 类型 | 是否必填 | 说明 |
|-------|------|---------|-----|
| bankCode | String | 是 | 银行代码 |
| billIds | Array | 是 | 账单ID数组 |
| batchNo | String | 是 | 批次号 |
- **响应示例**:
```json
{
"code": 0,
"msg": "success",
"data": {
"batchNo": "BK20230510001",
"totalAmount": 1000.0,
"totalCount": 10,
"requestTime": "2023-05-10 10:00:00",
"status": "PROCESSING"
},
"timestamp": 1621234567890
}
```
### 2. 微信支付接口
#### 2.1 发起微信支付
- **接口地址**: `/api/v1/external/wechat/create-order`
- **请求方式**: POST
- **接口描述**: 创建微信支付订单
- **请求参数**:
| 参数名 | 类型 | 是否必填 | 说明 |
|-------|------|---------|-----|
| billId | Long | 是 | 账单ID |
| openId | String | 是 | 用户微信openId |
| amount | Decimal | 是 | 支付金额 |
- **响应示例**:
```json
{
"code": 0,
"msg": "success",
"data": {
"prepayId": "wx2023051010000000000000000000",
"nonceStr": "ibuaiVcKdpRxkhJA",
"timeStamp": "1621234567",
"signType": "MD5",
"paySign": "70EA570631E4BB79628FBCA90534C63FF7FADD89"
},
"timestamp": 1621234567890
}
```
### 3. 短信通知接口
#### 3.1 发送短信通知
- **接口地址**: `/api/v1/external/sms/send`
- **请求方式**: POST
- **接口描述**: 发送短信通知
- **请求参数**:
| 参数名 | 类型 | 是否必填 | 说明 |
|-------|------|---------|-----|
| phone | String | 是 | 手机号 |
| templateId | String | 是 | 短信模板ID |
| params | Object | 是 | 短信参数 |
- **响应示例**:
```json
{
"code": 0,
"msg": "success",
"data": {
"messageId": "SMS20230510001",
"sendTime": "2023-05-10 10:00:00",
"status": "SENT"
},
"timestamp": 1621234567890
}
```
## 五、接口安全设计
### 1. 认证机制
- **JWT认证**: 使用JWT进行接口认证访问需要权限的接口时必须在请求头中携带有效的Token
- **Token刷新**: 提供Token刷新机制避免频繁登录
- **多端登录控制**: 支持控制同一账号多端登录策略
### 2. 权限控制
- **RBAC权限模型**: 基于角色的权限控制,精细化权限管理
- **接口权限**: 每个接口绑定权限标识,通过注解方式声明
- **数据权限**: 支持部门级、用户级数据权限控制
### 3. 安全防护
- **参数验证**: 严格校验请求参数,防止非法参数
- **SQL注入防护**: 使用参数绑定方式防止SQL注入
- **XSS防护**: 过滤请求参数中的恶意脚本
- **CSRF防护**: 使用Token验证防止CSRF攻击
- **接口限流**: 对关键接口实施限流措施,防止恶意攻击
- **日志追踪**: 记录接口调用日志,便于安全审计
## 六、接口测试策略
### 1. 单元测试
- 编写接口单元测试,验证接口功能正确性
- 使用MockMVC进行Controller层测试
- 使用Mock框架模拟外部依赖
### 2. 集成测试
- 编写接口集成测试,验证接口与其他组件的交互
- 使用测试容器进行数据库测试
- 测试完整业务流程
### 3. 性能测试
- 使用JMeter等工具进行接口性能测试
- 测试接口响应时间
- 测试接口并发处理能力
- 测试系统在高负载下的稳定性
## 七、接口文档管理
### 1. 文档生成
- 使用Swagger/Knife4j自动生成接口文档
- 通过API注解提供详细的接口说明
- 支持在线调试接口
### 2. 版本管理
- 明确的接口版本控制策略
- 接口变更记录
- 兼容性说明
### 3. 文档发布
- 提供在线接口文档站点
- 支持导出PDF、HTML等格式
- 权限控制,限制文档访问范围