# 福建水务营收系统接口设计 ## 一、接口设计概述 福建水务营收系统采用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等格式 - 权限控制,限制文档访问范围