277 lines
		
	
	
		
			6.3 KiB
		
	
	
	
		
			Markdown
		
	
	
	
	
	
		
		
			
		
	
	
			277 lines
		
	
	
		
			6.3 KiB
		
	
	
	
		
			Markdown
		
	
	
	
	
	
|  | # 发票API接口文档
 | |||
|  | 
 | |||
|  | ## 概述
 | |||
|  | 
 | |||
|  | 本文档描述了发票管理相关的API接口,包括用户申请开票和管理员处理开票申请的功能。 | |||
|  | 
 | |||
|  | ## 基础信息
 | |||
|  | 
 | |||
|  | - **Base URL**: `http://localhost:8080` | |||
|  | - **认证方式**: Bearer Token (JWT) | |||
|  | - **Content-Type**: `application/json` | |||
|  | 
 | |||
|  | ## 用户接口
 | |||
|  | 
 | |||
|  | ### 1. 申请开票
 | |||
|  | 
 | |||
|  | **接口地址**: `POST /api/v1/invoices/apply` | |||
|  | 
 | |||
|  | **请求参数**: | |||
|  | ```json | |||
|  | { | |||
|  |   "invoice_type": "general",  // 发票类型: general(普票) | special(专票) | |||
|  |   "amount": "1000.00",        // 开票金额 | |||
|  |   "invoice_info": { | |||
|  |     "company_name": "海南省学宇思网络科技有限公司", | |||
|  |     "taxpayer_id": "91460108MADNY3F43W", | |||
|  |     "bank_name": "中国银行海口分行",           // 专票必填 | |||
|  |     "bank_account": "1234567890123456",      // 专票必填 | |||
|  |     "company_address": "海南省海口市",        // 专票必填 | |||
|  |     "company_phone": "0898-12345678",        // 专票必填 | |||
|  |     "receiving_email": "ilirnax@gmail.com" | |||
|  |   } | |||
|  | } | |||
|  | ``` | |||
|  | 
 | |||
|  | **响应示例**: | |||
|  | ```json | |||
|  | { | |||
|  |   "success": true, | |||
|  |   "message": "申请开票成功", | |||
|  |   "data": { | |||
|  |     "id": "uuid", | |||
|  |     "user_id": "user_uuid", | |||
|  |     "invoice_type": "general", | |||
|  |     "amount": "1000.00", | |||
|  |     "status": "pending", | |||
|  |     "invoice_info": { | |||
|  |       "company_name": "海南省学宇思网络科技有限公司", | |||
|  |       "taxpayer_id": "91460108MADNY3F43W", | |||
|  |       "receiving_email": "ilirnax@gmail.com" | |||
|  |     }, | |||
|  |     "created_at": "2024-01-01T12:00:00Z" | |||
|  |   } | |||
|  | } | |||
|  | ``` | |||
|  | 
 | |||
|  | ### 2. 获取用户发票信息
 | |||
|  | 
 | |||
|  | **接口地址**: `GET /api/v1/invoices/info` | |||
|  | 
 | |||
|  | **响应示例**: | |||
|  | ```json | |||
|  | { | |||
|  |   "success": true, | |||
|  |   "message": "获取发票信息成功", | |||
|  |   "data": { | |||
|  |     "company_name": "海南省学宇思网络科技有限公司", | |||
|  |     "taxpayer_id": "91460108MADNY3F43W", | |||
|  |     "bank_name": "", | |||
|  |     "bank_account": "", | |||
|  |     "company_address": "", | |||
|  |     "company_phone": "", | |||
|  |     "receiving_email": "ilirnax@gmail.com", | |||
|  |     "is_complete": false, | |||
|  |     "missing_fields": ["基本开户银行", "基本开户账号", "企业注册地址", "企业注册电话"] | |||
|  |   } | |||
|  | } | |||
|  | ``` | |||
|  | 
 | |||
|  | ### 3. 更新用户发票信息
 | |||
|  | 
 | |||
|  | **接口地址**: `PUT /api/v1/invoices/info` | |||
|  | 
 | |||
|  | **请求参数**: | |||
|  | ```json | |||
|  | { | |||
|  |   "company_name": "海南省学宇思网络科技有限公司", | |||
|  |   "taxpayer_id": "91460108MADNY3F43W", | |||
|  |   "bank_name": "中国银行海口分行", | |||
|  |   "bank_account": "1234567890123456", | |||
|  |   "company_address": "海南省海口市", | |||
|  |   "company_phone": "0898-12345678", | |||
|  |   "receiving_email": "ilirnax@gmail.com" | |||
|  | } | |||
|  | ``` | |||
|  | 
 | |||
|  | ### 4. 获取用户开票记录
 | |||
|  | 
 | |||
|  | **接口地址**: `GET /api/v1/invoices/records?page=1&page_size=10&status=completed` | |||
|  | 
 | |||
|  | **查询参数**: | |||
|  | - `page`: 页码 (默认: 1) | |||
|  | - `page_size`: 每页数量 (默认: 10, 最大: 100) | |||
|  | - `status`: 状态筛选 (可选: pending, completed, rejected) | |||
|  | 
 | |||
|  | **响应示例**: | |||
|  | ```json | |||
|  | { | |||
|  |   "success": true, | |||
|  |   "message": "获取开票记录成功", | |||
|  |   "data": { | |||
|  |     "records": [ | |||
|  |       { | |||
|  |         "id": "uuid", | |||
|  |         "user_id": "user_uuid", | |||
|  |         "invoice_type": "general", | |||
|  |         "amount": "1000.00", | |||
|  |         "status": "completed", | |||
|  |         "company_name": "海南省学宇思网络科技有限公司", | |||
|  |         "file_name": "invoice_20240101.pdf", | |||
|  |         "file_size": 1024000, | |||
|  |         "file_url": "https://example.com/invoice.pdf", | |||
|  |         "processed_at": "2024-01-01T14:00:00Z", | |||
|  |         "created_at": "2024-01-01T12:00:00Z" | |||
|  |       } | |||
|  |     ], | |||
|  |     "total": 1, | |||
|  |     "page": 1, | |||
|  |     "page_size": 10, | |||
|  |     "total_pages": 1 | |||
|  |   } | |||
|  | } | |||
|  | ``` | |||
|  | 
 | |||
|  | ### 5. 获取可开票金额
 | |||
|  | 
 | |||
|  | **接口地址**: `GET /api/v1/invoices/available-amount` | |||
|  | 
 | |||
|  | **响应示例**: | |||
|  | ```json | |||
|  | { | |||
|  |   "success": true, | |||
|  |   "message": "获取可开票金额成功", | |||
|  |   "data": { | |||
|  |     "available_amount": "5000.00", | |||
|  |     "total_recharged": "10000.00", | |||
|  |     "total_gifted": "1000.00", | |||
|  |     "total_invoiced": "4000.00" | |||
|  |   } | |||
|  | } | |||
|  | ``` | |||
|  | 
 | |||
|  | ### 6. 下载发票文件
 | |||
|  | 
 | |||
|  | **接口地址**: `GET /api/v1/invoices/{application_id}/download` | |||
|  | 
 | |||
|  | **响应示例**: | |||
|  | ```json | |||
|  | { | |||
|  |   "success": true, | |||
|  |   "message": "获取下载信息成功", | |||
|  |   "data": { | |||
|  |     "file_id": "file_uuid", | |||
|  |     "file_name": "invoice_20240101.pdf", | |||
|  |     "file_size": 1024000, | |||
|  |     "file_url": "https://example.com/invoice.pdf" | |||
|  |   } | |||
|  | } | |||
|  | ``` | |||
|  | 
 | |||
|  | ## 管理员接口
 | |||
|  | 
 | |||
|  | ### 1. 获取待处理的发票申请列表
 | |||
|  | 
 | |||
|  | **接口地址**: `GET /api/v1/admin/invoices/pending?page=1&page_size=10` | |||
|  | 
 | |||
|  | **响应示例**: | |||
|  | ```json | |||
|  | { | |||
|  |   "success": true, | |||
|  |   "message": "获取待处理申请列表成功", | |||
|  |   "data": { | |||
|  |     "applications": [ | |||
|  |       { | |||
|  |         "id": "uuid", | |||
|  |         "user_id": "user_uuid", | |||
|  |         "invoice_type": "general", | |||
|  |         "amount": "1000.00", | |||
|  |         "status": "pending", | |||
|  |         "company_name": "海南省学宇思网络科技有限公司", | |||
|  |         "receiving_email": "ilirnax@gmail.com", | |||
|  |         "created_at": "2024-01-01T12:00:00Z" | |||
|  |       } | |||
|  |     ], | |||
|  |     "total": 1, | |||
|  |     "page": 1, | |||
|  |     "page_size": 10, | |||
|  |     "total_pages": 1 | |||
|  |   } | |||
|  | } | |||
|  | ``` | |||
|  | 
 | |||
|  | ### 2. 通过发票申请(上传发票)
 | |||
|  | 
 | |||
|  | **接口地址**: `POST /api/v1/admin/invoices/{application_id}/approve` | |||
|  | 
 | |||
|  | **请求方式**: `multipart/form-data` | |||
|  | 
 | |||
|  | **请求参数**: | |||
|  | - `file`: 发票文件 (PDF格式) | |||
|  | - `admin_notes`: 管理员备注 (可选) | |||
|  | 
 | |||
|  | **响应示例**: | |||
|  | ```json | |||
|  | { | |||
|  |   "success": true, | |||
|  |   "message": "通过发票申请成功", | |||
|  |   "data": null | |||
|  | } | |||
|  | ``` | |||
|  | 
 | |||
|  | ### 3. 拒绝发票申请
 | |||
|  | 
 | |||
|  | **接口地址**: `POST /api/v1/admin/invoices/{application_id}/reject` | |||
|  | 
 | |||
|  | **请求参数**: | |||
|  | ```json | |||
|  | { | |||
|  |   "reason": "发票信息不完整,请补充企业注册地址和电话" | |||
|  | } | |||
|  | ``` | |||
|  | 
 | |||
|  | **响应示例**: | |||
|  | ```json | |||
|  | { | |||
|  |   "success": true, | |||
|  |   "message": "拒绝发票申请成功", | |||
|  |   "data": null | |||
|  | } | |||
|  | ``` | |||
|  | 
 | |||
|  | ## 错误码说明
 | |||
|  | 
 | |||
|  | | 状态码 | 说明 | | |||
|  | |--------|------| | |||
|  | | 200 | 请求成功 | | |||
|  | | 400 | 请求参数错误 | | |||
|  | | 401 | 用户未登录或认证已过期 | | |||
|  | | 403 | 权限不足 | | |||
|  | | 404 | 资源不存在 | | |||
|  | | 500 | 服务器内部错误 | | |||
|  | 
 | |||
|  | ## 业务规则
 | |||
|  | 
 | |||
|  | ### 开票金额限制
 | |||
|  | - 用户只能申请充值金额(除去赠送)减去已开票金额 | |||
|  | - 开票金额必须大于0 | |||
|  | 
 | |||
|  | ### 发票信息验证
 | |||
|  | - **普票**: 至少需要公司名称、纳税人识别号、接收邮箱 | |||
|  | - **专票**: 需要完整的企业信息(包括银行信息、地址、电话) | |||
|  | 
 | |||
|  | ### 状态流转
 | |||
|  | - `pending` (待处理) → `completed` (已完成) 或 `rejected` (已拒绝) | |||
|  | 
 | |||
|  | ### 文件要求
 | |||
|  | - 发票文件格式:PDF | |||
|  | - 文件大小限制:10MB | |||
|  | - 文件命名:`invoice_{application_id}.pdf` | |||
|  | 
 | |||
|  | ## 注意事项
 | |||
|  | 
 | |||
|  | 1. 所有接口都需要JWT认证 | |||
|  | 2. 管理员接口需要管理员权限 | |||
|  | 3. 文件上传接口使用 `multipart/form-data` 格式 | |||
|  | 4. 金额字段使用字符串格式,精确到分 | |||
|  | 5. 时间字段使用ISO 8601格式  |