提交
This commit is contained in:
1 parent
df53d05193
commit
f90726927e
50 files changed
+16281
-12780
No files matched your search
@@ -0,0 +1,2 @@
|
||||
schema: spec-driven
|
||||
created: 2026-07-07
|
||||
@@ -0,0 +1,38 @@
|
||||
# 设计:从任务执行派发临时生产工单
|
||||
|
||||
## 流程
|
||||
|
||||
1. 用户在任务执行弹窗进入「产出(细胞产品)」。
|
||||
2. 点击「派发临时工单」→ 校验原材料完整且已保存(`input` scope 无脏数据)。
|
||||
3. 弹出「新增临时工单」弹窗(仅备注,与生产工单临时 Tab 一致)。
|
||||
4. 确认 → 调用 `spawn-temporary-work-order` API 创建 LSSC 工单。
|
||||
5. 打开 `DispatchTaskDialog`,用户填写任务名称/工艺路线并生成任务。
|
||||
6. 任务创建成功 → 前端调用 `set_task_inputs` 写入 API 返回的 `inputItems`(仅原材料,不含产出)。
|
||||
|
||||
## 约束
|
||||
|
||||
- 来源任务须至少一条已持久化原材料,且每条具备 `inputType` 与编码/名称/id(**含临时生产工单来源任务**)。
|
||||
- **SHALL NOT** 复制当前任务产出(细胞产品)。
|
||||
- 按钮在只读下不展示(**已完成 `ywc` 任务除外:只读查看时仍展示派发**)。
|
||||
|
||||
## API
|
||||
|
||||
`POST /web/admin/production-tasks/{task_id}/spawn-temporary-work-order`
|
||||
|
||||
Body: `{ remark?: string }`
|
||||
|
||||
Response:
|
||||
|
||||
```json
|
||||
{
|
||||
"workOrder": { "id", "workOrderNo", "workOrderStatus", ... },
|
||||
"sourceTaskId": "...",
|
||||
"sourceTaskNo": "...",
|
||||
"inputItems": [{ "inputType", "inputId", "inputCode", "inputName", "remark" }]
|
||||
}
|
||||
```
|
||||
|
||||
## UI
|
||||
|
||||
- 按钮:`btn-ghost` + `Position` 图标,文案「派发临时工单」,位于产出底栏「保存」左侧。
|
||||
- 不可用时 `disabled` + tooltip 说明需先保存原材料。
|
||||
@@ -0,0 +1,26 @@
|
||||
## Why
|
||||
|
||||
入库/出库生产任务执行时,常需将同一批已登记原材料(样本或细胞产品)延续到一条独立的临时生产链路(如在培分支)。现状需手动新建临时工单、再派发任务、再逐条添加原材料,步骤分散且易漏。
|
||||
|
||||
## What Changes
|
||||
|
||||
- **任务执行弹窗**:在「产出(细胞产品)」底栏增加「派发临时工单」按钮;仅当原材料已填写且已保存时可操作。
|
||||
- **后端 API**:`POST /web/admin/production-tasks/{id}/spawn-temporary-work-order` — 校验来源任务、读取已保存原材料、创建 LSSC 临时工单并返回复制载荷。
|
||||
- **前端联动**:弹出与「新增临时工单」相同的备注弹窗;确认后打开「派发生产任务」;任务创建成功后自动 `set_task_inputs` 复制原材料(**不复制产出**)。
|
||||
|
||||
## Capabilities
|
||||
|
||||
### New Capabilities
|
||||
|
||||
- `spawn-temp-work-order-from-task`: 从生产任务执行上下文派发临时生产工单并复制原材料
|
||||
|
||||
### Modified Capabilities
|
||||
|
||||
(无既有 spec 需求变更)
|
||||
|
||||
## Impact
|
||||
|
||||
- `backend/app/crud/production_task.py`、`backend/app/api/production.py`、`backend/app/schemas/production_task.py`
|
||||
- `web-admin/src/views/production/production-work-order/TaskExecutionDialog.vue`
|
||||
- `web-admin/src/views/production/production-work-order/DispatchTaskDialog.vue`
|
||||
- `web-admin/src/api/production-task.ts`
|
||||
+63
@@ -0,0 +1,63 @@
|
||||
# spawn-temp-work-order-from-task
|
||||
|
||||
## Purpose
|
||||
|
||||
从生产任务执行弹窗「产出(细胞产品)」发起临时生产工单,并复制已保存原材料至新任务。
|
||||
|
||||
## Requirements
|
||||
|
||||
### Requirement: 产出页派发临时工单入口
|
||||
|
||||
任务执行弹窗(非只读,或已完成只读查看)SHALL 在「产出(细胞产品)」详情底栏提供「派发临时工单」按钮。入库、出库、**临时**生产工单下的任务均 MAY 派发;生产工单或任务状态为已完成(`ywc`)时 SHALL 仍允许派发(只读查看入口亦须可用)。
|
||||
|
||||
#### Scenario: 展示按钮
|
||||
|
||||
- **WHEN** 用户打开生产任务执行弹窗(含临时生产工单任务)并进入「产出(细胞产品)」
|
||||
- **THEN** 底栏显示「派发临时工单」按钮(描边样式,带图标)
|
||||
|
||||
#### Scenario: 临时工单任务可继续派发
|
||||
|
||||
- **WHEN** 当前任务所属工单 `workOrderType` 为 `temporary`,且已保存原材料
|
||||
- **THEN** 仍可点击「派发临时工单」,系统创建新的 LSSC 临时工单并复制原材料
|
||||
|
||||
#### Scenario: 已完成工单或任务仍可派发
|
||||
|
||||
- **WHEN** 生产工单或生产任务状态为 `ywc`(已完成),且任务已保存原材料
|
||||
- **THEN** 在产出页仍可点击「派发临时工单」(含只读「查看」进入的执行弹窗)
|
||||
|
||||
### Requirement: 原材料门禁
|
||||
|
||||
系统 SHALL 仅在来源任务原材料已填写完整且已保存(无未保存的 `input` 变更)时允许派发;否则按钮禁用或点击后提示。
|
||||
|
||||
#### Scenario: 未保存原材料
|
||||
|
||||
- **WHEN** 原材料存在未保存修改
|
||||
- **THEN** 用户无法完成派发,并提示先保存原材料
|
||||
|
||||
#### Scenario: 原材料为空
|
||||
|
||||
- **WHEN** 来源任务无任何已保存原材料
|
||||
- **THEN** API 返回 400,提示先填写并保存原材料
|
||||
|
||||
### Requirement: 创建临时工单与复制原材料
|
||||
|
||||
派发确认后,系统 SHALL 创建 `work_order_type=temporary` 的生产工单(LSSC 编号);用户通过既有「派发生产任务」创建新任务后,系统 SHALL 将来源任务已保存的原材料复制至新任务 `biz_production_task_input`;SHALL NOT 复制来源任务产出(细胞产品)。
|
||||
|
||||
#### Scenario: 成功派发
|
||||
|
||||
- **WHEN** 用户填写备注并确认,随后在派发弹窗中成功创建临时工单下的生产任务
|
||||
- **THEN** 新任务原材料与来源任务已保存原材料一致(样本/细胞产品类型与关联 id 一致)
|
||||
|
||||
#### Scenario: 不复制产出
|
||||
|
||||
- **WHEN** 来源任务已保存多条产出(细胞产品)
|
||||
- **THEN** 新任务原材料中不包含上述产出记录
|
||||
|
||||
### Requirement: 新增临时工单弹窗一致
|
||||
|
||||
派发时弹出的备注弹窗 SHALL 与生产工单「临时」Tab「新增临时工单」交互一致(标题、备注字段、确认/取消)。
|
||||
|
||||
#### Scenario: 弹窗交互
|
||||
|
||||
- **WHEN** 用户点击「派发临时工单」且通过原材料门禁
|
||||
- **THEN** 展示「新增临时工单」弹窗,确认后创建临时工单
|
||||
@@ -0,0 +1,16 @@
|
||||
## 1. OpenSpec & Backend
|
||||
|
||||
- [x] 1.1 编写 proposal / design / spec
|
||||
- [x] 1.2 `spawn_temporary_work_order_from_task` CRUD + schema
|
||||
- [x] 1.3 注册 `POST /production-tasks/{id}/spawn-temporary-work-order`
|
||||
|
||||
## 2. Frontend
|
||||
|
||||
- [x] 2.1 `fetchSpawnTemporaryWorkOrderFromTask` API
|
||||
- [x] 2.2 `TaskExecutionDialog` 产出底栏按钮 + 临时工单弹窗
|
||||
- [x] 2.3 `DispatchTaskDialog` 发出 `taskCreated` 事件并复制原材料
|
||||
|
||||
## 3. Verification
|
||||
|
||||
- [x] 3.1 更新知识图谱
|
||||
- [x] 3.2 Lint 检查改动文件
|
||||
Reference in new issue
Block a user