1
0
forked from erp-dev/erp
Files
erpnew/docs/cost/api.md
2026-06-09 11:15:02 +08:00

329 lines
7.7 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.
# API v2 成本模块接口文档
本文档面向前端,描述 `cost` 成本模块的 API。
## 基本约定
- Base URL: `/api/v2`
- 认证所有接口都需要登录JWT
- 人员身份:后端使用 `request.user.employee` 作为当前员工身份。
- 多商户隔离:所有类目、支出明细只允许访问当前员工所属商户的数据;可通过 `?merchant_id=` 参数跨商户查询(如果权限允许)。
- 时间格式:请求参数中的日期使用 `YYYY-MM-DD`(如 `2026-06-01`),响应中的日期时间使用 ISO 8601。
---
## 1. 支出类目
### 1.1 类目列表
```
GET /api/v2/cost-categories/
```
查询参数:
| 参数 | 类型 | 必填 | 说明 |
|------|------|------|------|
| `merchant_id` | int | 否 | 按商户筛选,不传则使用当前员工的商户 |
成功响应 `200`
```json
[
{
"id": 1,
"merchant_id": 1,
"unique_key": "electricity",
"name": "电费",
"parent_id": null,
"description": "每月电费支出",
"created_at": "2026-06-06T10:00:00Z",
"updated_at": "2026-06-06T10:00:00Z"
}
]
```
### 1.2 创建类目
```
POST /api/v2/cost-categories/
```
请求体JSON
| 字段 | 类型 | 必填 | 说明 |
|------|------|------|------|
| `unique_key` | string | **是** | 唯一标识键,同商户不可重复,如 `electricity` |
| `name` | string | **是** | 类目名称 |
| `parent_id` | int | 否 | 父类目 ID用于层级 |
| `description` | string | 否 | 描述 |
请求示例:
```json
{
"unique_key": "electricity",
"name": "电费",
"description": "每月电费支出"
}
```
成功响应 `201`
```json
{
"id": 1,
"merchant_id": 1,
"unique_key": "electricity",
"name": "电费",
"parent_id": null,
"description": "每月电费支出",
"created_at": "2026-06-06T10:00:00Z",
"updated_at": "2026-06-06T10:00:00Z"
}
```
错误响应 `400`:缺少必填字段时返回校验错误。
### 1.3 类目详情
```
GET /api/v2/cost-categories/{category_id}/
```
成功响应 `200`:返回单个类目对象,结构同上。
错误响应 `404`:类目不存在或不属于当前商户。
### 1.4 修改类目
```
PUT /api/v2/cost-categories/{category_id}/
```
请求体JSON所有字段可选
| 字段 | 类型 | 说明 |
|------|------|------|
| `unique_key` | string | 唯一标识键 |
| `name` | string | 类目名称 |
| `parent_id` | int | 父类目 ID`null` 清除 |
| `description` | string | 描述 |
成功响应 `200`:返回更新后的类目对象。
### 1.5 删除类目
```
DELETE /api/v2/cost-categories/{category_id}/
```
成功响应 `204`(无响应体)。
错误响应 `404`:类目不存在或不属于当前商户。
---
## 2. 支出明细
### 2.1 支出明细列表
```
GET /api/v2/cost-entries/
```
查询参数:
| 参数 | 类型 | 必填 | 说明 |
|------|------|------|------|
| `merchant_id` | int | 否 | 按商户筛选 |
| `category_id` | int | 否 | 按支出类目筛选 |
| `start` | date | 否 | 发生日期起始,格式 `YYYY-MM-DD` |
| `end` | date | 否 | 发生日期截止,格式 `YYYY-MM-DD` |
默认按 `occurred_at` 降序排列。
成功响应 `200`
```json
[
{
"id": 1,
"merchant_id": 1,
"category_id": 1,
"category_name": "电费",
"amount": "350.00",
"occurred_at": "2026-06-01",
"operator_id": 12,
"image1": "",
"image2": "",
"source_module": "",
"source_id": "",
"remarks": "六月份电费",
"created_at": "2026-06-06T10:00:00Z",
"updated_at": "2026-06-06T10:00:00Z"
}
]
```
字段说明:
| 字段 | 类型 | 说明 |
|------|------|------|
| `amount` | string | 金额Decimal 转字符串,前端展示时注意格式化) |
| `occurred_at` | string | 发生日期,`YYYY-MM-DD` |
| `operator_id` | int | 经办人 ID自动从当前登录用户获取 |
| `image1` | string | 凭证图片 URL七牛云 CDN无则为空字符串 |
| `image2` | string | 备用凭证图片 URL无则为空字符串 |
| `source_module` | string | 来源模块名,手工录入时为空 |
| `source_id` | string | 来源记录 ID手工录入时为空 |
### 2.2 创建支出明细
```
POST /api/v2/cost-entries/
```
Content-Type: `multipart/form-data`(支持图片上传)或 `application/json`
请求体:
| 字段 | 类型 | 必填 | 说明 |
|------|------|------|------|
| `category_id` | int | **是** | 支出类目 ID |
| `amount` | decimal | **是** | 金额,如 `"350.00"` |
| `occurred_at` | date | **是** | 发生日期,`YYYY-MM-DD` |
| `image1` | file | 否 | 凭证图片 |
| `image2` | file | 否 | 备用凭证图片 |
| `source_module` | string | 否 | 来源模块名 |
| `source_id` | string | 否 | 来源记录 ID |
| `remarks` | string | 否 | 备注 |
请求示例JSON
```json
{
"category_id": 1,
"amount": "350.00",
"occurred_at": "2026-06-01",
"remarks": "六月份电费"
}
```
成功响应 `201`:返回创建的支出明细对象。
错误响应 `400`:校验失败。
错误响应 `404``category_id` 不存在或不属于当前商户。
### 2.3 支出明细详情
```
GET /api/v2/cost-entries/{entry_id}/
```
成功响应 `200`:返回单个支出明细对象,含 `category_name`
错误响应 `404`:明细不存在或不属于当前商户。
### 2.4 修改支出明细
```
PUT /api/v2/cost-entries/{entry_id}/
```
Content-Type: `multipart/form-data``application/json`
请求体(所有字段可选):
| 字段 | 类型 | 说明 |
|------|------|------|
| `category_id` | int | 切换类目 |
| `amount` | decimal | 金额 |
| `occurred_at` | date | 发生日期 |
| `image1` | file | 凭证图片 |
| `image2` | file | 备用凭证图片 |
| `source_module` | string | 来源模块名 |
| `source_id` | string | 来源记录 ID |
| `remarks` | string | 备注 |
成功响应 `200`:返回更新后的支出明细对象。
### 2.5 删除支出明细
```
DELETE /api/v2/cost-entries/{entry_id}/
```
成功响应 `204`
错误响应 `404`:明细不存在或不属于当前商户。
---
## 3. 按类目汇总
```
GET /api/v2/cost-summary/by-category/
```
查询参数:
| 参数 | 类型 | 必填 | 说明 |
|------|------|------|------|
| `merchant_id` | int | 否 | 按商户筛选 |
| `start` | date | 否 | 发生日期起始 |
| `end` | date | 否 | 发生日期截止 |
`total_amount` 降序排列。
成功响应 `200`
```json
{
"merchant_id": 1,
"start_date": "2026-06-01",
"end_date": "2026-06-30",
"results": [
{
"category_id": 1,
"category_name": "电费",
"category_key": "electricity",
"total_amount": "500.00",
"entry_count": 2
},
{
"category_id": 2,
"category_name": "水费",
"category_key": "water",
"total_amount": "80.00",
"entry_count": 1
}
]
}
```
字段说明:
| 字段 | 类型 | 说明 |
|------|------|------|
| `total_amount` | string | 该类别在查询时间段内的总金额 |
| `entry_count` | integer | 该类别在查询时间段内的记录数 |
| `category_key` | string | 类目唯一键,可用于前端做图表的 key 映射 |
---
## 快速参考
| Method | URL | 说明 |
|--------|-----|------|
| GET | `/api/v2/cost-categories/` | 类目列表 |
| POST | `/api/v2/cost-categories/` | 创建类目 |
| GET | `/api/v2/cost-categories/{id}/` | 类目详情 |
| PUT | `/api/v2/cost-categories/{id}/` | 修改类目 |
| DELETE | `/api/v2/cost-categories/{id}/` | 删除类目 |
| GET | `/api/v2/cost-entries/` | 支出明细列表 |
| POST | `/api/v2/cost-entries/` | 创建支出明细 |
| GET | `/api/v2/cost-entries/{id}/` | 支出明细详情 |
| PUT | `/api/v2/cost-entries/{id}/` | 修改支出明细 |
| DELETE | `/api/v2/cost-entries/{id}/` | 删除支出明细 |
| GET | `/api/v2/cost-summary/by-category/` | 按类目汇总 |