1
0
forked from erp-dev/erp
Files
erpnew/docs/api_task_allocation_proposal.md

490 lines
15 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 需求文档
> **业务背景:** 布行预销售单场景客户预定布料如5000米需要仓库人员配货、扫码录入每条布的米数确认后转为正式销售单。
>
> **前端项目:** app-ui移动端 Web 应用)
>
> **生成日期:** 2026-02-01
---
## 一、业务流程概述
```
┌─────────────┐ ┌─────────────┐ ┌─────────────┐ ┌─────────────┐
│ 创建预销售单 │ -> │ 生成任务配货 │ -> │ 仓库扫码录入 │ -> │ 确认转销售单 │
└─────────────┘ └─────────────┘ └─────────────┘ └─────────────┘
│ │ │ │
▼ ▼ ▼ ▼
客户预定 任务分配给 扫码录入每条 客户确认数量
5000米布料 仓库配货人员 布料的实际米数 转为正式销售单
```
### 角色说明
| 角色 | 操作 |
|------|------|
| 销售人员 | 创建预销售单,确认配货结果,转销售单 |
| 仓库人员 | 接收任务配货,扫码录入每条布的米数 |
| 客户 | 确认最终数量(可选,由销售人员代为确认) |
### 状态流转
```
预销售单状态:
待配货(pending) → 配货中(allocating) → 待确认(confirming) → 已完成(completed) / 已取消(cancelled)
任务配货状态:
待接收(pending) → 进行中(in_progress) → 已完成(completed) / 已取消(cancelled)
```
---
## 二、需要新增的 API
### 2.1 预销售单 API移动端
> antd-demo 已有预销售单 API需确认 app-ui 是否复用同一套接口
**复用现有接口:**
- `POST /api/v1/pre-sales-orders/` - 创建预销售单
- `GET /api/v1/pre-sales-orders/` - 预销售单列表
- `GET /api/v1/pre-sales-orders/{id}/` - 预销售单详情
**需要新增/调整:**
- 创建预销售单时**自动创建任务配货**(后端处理,或前端调用两个接口)
- 预销售单需要新增 `status` 字段表示配货状态
---
### 2.2 任务配货 API新增
#### 2.2.1 创建任务配货
> 可选择在创建预销售单时由后端自动创建,或由前端单独调用
- **路径:** `POST /api/v1/task-allocations/`
- **权限:** 需登录,需员工权限
**请求参数:**
```typescript
{
pre_sales_order_id: number; // 必填,关联的预销售单 ID
assignee_id?: number; // 可选,指派给哪个仓库员工(不填则待分配)
priority?: number; // 可选优先级1=普通2=加急默认1
expected_date?: string; // 可选期望完成日期ISO 8601
remarks?: string; // 可选,备注
}
```
**响应数据:**
```typescript
{
code: 200,
message: "success",
data: {
id: number; // 任务配货 ID
task_no: string; // 任务编号(如 PH20260201000001
pre_sales_order_id: number; // 关联预销售单 ID
pre_sales_order_no: string; // 预销售单编号(只读)
customer_id: number; // 客户 ID从预销售单继承
customer_name: string; // 客户名称(只读)
warehouse_id: number; // 仓库 ID从预销售单继承
warehouse_name: string; // 仓库名称(只读)
assignee_id: number | null; // 被指派的员工 ID
assignee_name: string | null; // 被指派的员工名称(只读)
status: number; // 状态1=待接收2=进行中3=已完成4=已取消
priority: number; // 优先级
expected_date: string | null; // 期望完成日期
remarks: string | null; // 备注
created_by: number; // 创建者 ID
created_by_name: string; // 创建者名称(只读)
created_at: string; // 创建时间
// 配货需求(从预销售单明细复制)
items: TaskAllocationItem[];
}
}
```
**任务配货明细 `TaskAllocationItem`**
```typescript
{
id: number; // 明细 ID
product_id: number; // 产品 ID
product_name: string; // 产品名称
spec: string | null; // 规格
color: string | null; // 颜色
required_quantity: string; // 需求数量(如 "5000.00"
allocated_quantity: string; // 已配货数量(如 "4800.00"
unit: string; // 单位
status: number; // 明细状态1=待配货2=配货中3=已完成
// 扫码录入的布条记录
rolls: TaskAllocationRoll[];
}
```
**布条记录 `TaskAllocationRoll`**
```typescript
{
id: number; // 记录 ID
roll_code: string; // 布条码/二维码内容
quantity: string; // 该条的米数(如 "50.00"
scanned_by: number; // 扫码人员 ID
scanned_by_name: string; // 扫码人员名称(只读)
scanned_at: string; // 扫码时间
}
```
---
#### 2.2.2 任务配货列表
- **路径:** `GET /api/v1/task-allocations/`
- **权限:** 需登录,需员工权限
**查询参数:**
```typescript
{
limit?: number; // 分页默认20最大100
offset?: number; // 偏移量默认0
status?: number; // 按状态筛选1/2/3/4
assignee_id?: number; // 按被指派人筛选(仓库人员查自己的任务)
warehouse_id?: number; // 按仓库筛选
priority?: number; // 按优先级筛选
date_from?: string; // 创建时间起始ISO 8601
date_to?: string; // 创建时间结束
}
```
**响应数据:**
```typescript
{
count: number;
next: string | null;
previous: string | null;
results: TaskAllocation[]; // 任务配货列表(不含 rolls 明细)
}
```
---
#### 2.2.3 任务配货详情
- **路径:** `GET /api/v1/task-allocations/{id}/`
- **权限:** 需登录
**响应数据:**
```typescript
{
code: 200,
data: TaskAllocation // 完整数据,包含 items 和 rolls
}
```
---
#### 2.2.4 接收任务
> 仓库人员接收任务,状态从"待接收"变为"进行中"
- **路径:** `POST /api/v1/task-allocations/{id}/accept/`
- **权限:** 需登录,需仓库员工权限
**请求参数:** 无(后端自动设置当前用户为 assignee
**响应数据:**
```typescript
{
code: 200,
message: "任务已接收",
data: TaskAllocation
}
```
---
#### 2.2.5 扫码录入布条 ⭐
> 仓库人员扫码录入每条布的米数
- **路径:** `POST /api/v1/task-allocations/{id}/scan/`
- **权限:** 需登录,需仓库员工权限
**请求参数:**
```typescript
{
item_id: number; // 哪个产品明细
roll_code: string; // 布条码/二维码内容
quantity: string | number; // 该条的米数
}
```
**响应数据:**
```typescript
{
code: 200,
message: "录入成功",
data: {
roll: TaskAllocationRoll; // 新增的布条记录
item: TaskAllocationItem; // 更新后的明细(含最新 allocated_quantity
task: {
id: number;
total_allocated: string; // 总已配货数量
total_required: string; // 总需求数量
progress: number; // 进度百分比0-100
}
}
}
```
**错误响应:**
```typescript
// 布条码重复
{
code: 400,
message: "该布条已录入",
data: {
existing_roll: TaskAllocationRoll // 已存在的记录
}
}
// 超出需求数量
{
code: 400,
message: "配货数量已超出需求,是否继续?",
data: {
required: "5000.00",
allocated: "5050.00",
overflow: "50.00"
}
}
```
---
#### 2.2.6 删除布条记录
> 录错了,删除某条扫码记录
- **路径:** `DELETE /api/v1/task-allocations/{id}/rolls/{roll_id}/`
- **权限:** 需登录,需仓库员工权限
**响应数据:**
```typescript
{
code: 200,
message: "删除成功",
data: {
item: TaskAllocationItem; // 更新后的明细
}
}
```
---
#### 2.2.7 完成配货
> 仓库人员完成配货,状态变为"已完成"
- **路径:** `POST /api/v1/task-allocations/{id}/complete/`
- **权限:** 需登录,需仓库员工权限
**请求参数:**
```typescript
{
remarks?: string; // 可选,完成备注
}
```
**响应数据:**
```typescript
{
code: 200,
message: "配货完成",
data: TaskAllocation
}
```
**校验规则:**
- 所有明细的 `allocated_quantity` 必须 > 0
- 如果某明细未配货,返回 400 错误
---
#### 2.2.8 确认配货结果并转销售单 ⭐
> 销售人员/客户确认配货数量,将预销售单转为正式销售单
- **路径:** `POST /api/v1/task-allocations/{id}/confirm-and-convert/`
- **权限:** 需登录,需销售员工权限
**请求参数:**
```typescript
{
confirmed_items: Array<{
item_id: number; // 明细 ID
confirmed_quantity: string; // 确认的数量(可能与实际配货数量不同)
}>;
remarks?: string; // 可选,确认备注
}
```
**响应数据:**
```typescript
{
code: 200,
message: "已转为销售单",
data: {
task_allocation: TaskAllocation; // 更新后的任务配货(状态变更)
sales_order: {
id: number;
human_id: string; // 销售单编号(如 XS20260201000001
// ... 其他销售单字段
}
}
}
```
---
### 2.3 预销售单状态扩展
现有预销售单 API 需要新增以下字段:
```typescript
// 响应中新增
{
// ... 原有字段 ...
allocation_status: number; // 配货状态1=待配货2=配货中3=待确认4=已完成
allocation_status_display: string; // 配货状态文字(只读)
task_allocation_id: number | null; // 关联的任务配货 ID
converted_sales_order_id: number | null; // 转换后的销售单 ID
}
```
---
## 三、状态枚举值
### 3.1 任务配货状态
| 值 | 名称 | 说明 |
|----|------|------|
| 1 | pending | 待接收 |
| 2 | in_progress | 进行中 |
| 3 | completed | 已完成 |
| 4 | cancelled | 已取消 |
### 3.2 任务配货明细状态
| 值 | 名称 | 说明 |
|----|------|------|
| 1 | pending | 待配货 |
| 2 | allocating | 配货中 |
| 3 | completed | 已完成 |
### 3.3 预销售单配货状态
| 值 | 名称 | 说明 |
|----|------|------|
| 1 | pending | 待配货 |
| 2 | allocating | 配货中 |
| 3 | confirming | 待确认 |
| 4 | completed | 已完成 |
### 3.4 优先级
| 值 | 名称 | 说明 |
|----|------|------|
| 1 | normal | 普通 |
| 2 | urgent | 加急 |
---
## 四、API 路径汇总
| 方法 | 路径 | 说明 |
|------|------|------|
| POST | `/api/v1/task-allocations/` | 创建任务配货 |
| GET | `/api/v1/task-allocations/` | 任务配货列表 |
| GET | `/api/v1/task-allocations/{id}/` | 任务配货详情 |
| POST | `/api/v1/task-allocations/{id}/accept/` | 接收任务 |
| POST | `/api/v1/task-allocations/{id}/scan/` | 扫码录入布条 |
| DELETE | `/api/v1/task-allocations/{id}/rolls/{roll_id}/` | 删除布条记录 |
| POST | `/api/v1/task-allocations/{id}/complete/` | 完成配货 |
| POST | `/api/v1/task-allocations/{id}/confirm-and-convert/` | 确认并转销售单 |
---
## 五、前端页面规划
### 5.1 页面路由
| 路由 | 页面 | 角色 |
|------|------|------|
| `/workstation/sales/pre-order` | 预销售单列表 | 销售 |
| `/workstation/sales/pre-order/create` | 创建预销售单 | 销售 |
| `/workstation/sales/pre-order/:id` | 预销售单详情 | 销售 |
| `/workstation/warehouse/task-allocation` | 任务配货列表 | 仓库 |
| `/workstation/warehouse/task-allocation/:id` | 任务配货详情/扫码录入 | 仓库 |
| `/workstation/warehouse/task-allocation/:id/scan` | 扫码录入页面 | 仓库 |
| `/workstation/sales/pre-order/:id/confirm` | 确认配货结果 | 销售 |
### 5.2 页面功能
**仓库人员 - 任务配货扫码页面:**
```
┌─────────────────────────────────┐
│ 任务配货 PH20260201000001 │
│ 客户XXX布业 仓库:主仓库 │
├─────────────────────────────────┤
│ 产品:涤纶面料-红色 │
│ 需求5000.00 米 │
│ 已配4800.00 米 [96%] │
│ ████████████████████░░ │
├─────────────────────────────────┤
│ ┌───────────────────────────┐ │
│ │ [扫码区域/摄像头] │ │
│ │ │ │
│ └───────────────────────────┘ │
│ │
│ 或手动输入: │
│ 布条码:[____________] │
│ 米 数:[____________] │
│ [录入] │
├─────────────────────────────────┤
│ 已录入布条3条
│ ┌───────────────────────────┐ │
│ │ R001 50.00米 张三 10:30 │ │
│ │ R002 48.50米 张三 10:32 │ │
│ │ R003 51.50米 张三 10:35 │ │
│ └───────────────────────────┘ │
├─────────────────────────────────┤
│ [完成配货] │
└─────────────────────────────────┘
```
---
## 六、确认事项
请后端同事确认:
1. [ ] 任务配货是否在创建预销售单时自动创建?还是需要手动创建?
2. [ ] 布条码的格式规范是什么?是否需要校验格式?
3. [ ] 一条布可能属于多个产品吗?还是一对一关系?
4. [ ] 配货超出需求数量时,是警告还是阻止?
5. [ ] 转销售单时,价格如何处理?(预销售单是否有价格字段?)
6. [ ] 是否需要支持"部分配货"后转销售单?
7. [ ] 任务配货是否需要支持"退回"操作(从进行中退回到待接收)?
8. [ ] 预销售单和任务配货是否一对一关系?还是一对多?
---
**前端负责人:** [待填写]
**后端负责人:** [待填写]
**评审日期:** [待填写]