闭环修复: transfer/spawn/receive补TaskRecord + reject加task_type + branchLabel只对SPAWN编号

This commit is contained in:
2026-08-06 13:14:26 +08:00
parent 661e77416a
commit 6a79e21302
3 changed files with 28 additions and 10 deletions

View File

@ -389,6 +389,7 @@ async def spawn_subtask(
await db.flush()
# 协助分支不改变产品宏观状态(只有主分支影响 overall_status
db.add(TaskRecord(task_id=task.id, remark=data.remark or f"[派发协助] 分配给 {data.assignee_id}", images="[]"))
await _create_task_log(db, child.id, action_type="create", operator_id=operator_id,
remark=f"协助分支(由「{task.task_name}」派发,分配给 {data.assignee_id}")
@ -462,6 +463,7 @@ async def receive_task(
operator_id=operator_id,
remark=remark or f"操作员确认接收任务「{task.task_name}",
)
db.add(TaskRecord(task_id=task.id, remark=remark or f"[接收] 操作员已确认接收", images="[]"))
# 接收时同步产品位置到接收人 + 宏观状态同步
product_result = await db.execute(select(Product).where(Product.id == task.product_id))
@ -560,6 +562,7 @@ async def reject_task(
task_name=task.task_name,
assignee_id=rework_assignee_id,
status=TASK_STATUS_PENDING,
task_type="TRANSFER",
notify_parent_on_complete=task.notify_parent_on_complete,
is_rework=True,
)
@ -638,6 +641,7 @@ async def transfer_task(
operator_id=operator_id,
remark=request.note or f"完成任务「{task.task_name}」,转交至下一道工序",
)
db.add(TaskRecord(task_id=task.id, remark=request.note or f"[完工转交] 移交下一工序", images="[]"))
# --- 动作 2解析下家 & 裂变 ---
# 兼容新旧格式

View File

@ -118,13 +118,20 @@ export default {
if (!this.product || !this.product.task_tree) return map;
const traverse = (tasks, prefix) => {
if (!tasks) return;
tasks.forEach((t, i) => {
const num = prefix ? `${prefix}.${i + 1}` : `${i + 1}`;
map[t.id] = `分支 ${num}`;
traverse(t.child_tasks, num);
let spawnIndex = 0;
tasks.forEach((t) => {
if (t.task_type !== 'SPAWN') {
map[t.id] = '主分支';
traverse(t.child_tasks, prefix);
} else {
spawnIndex++;
const num = prefix ? `${prefix}.${spawnIndex}` : `${spawnIndex}`;
map[t.id] = `分支 ${num}`;
traverse(t.child_tasks, num);
}
});
};
this.product.task_tree.forEach((t, i) => {
this.product.task_tree.forEach((t) => {
map[t.id] = '主分支';
traverse(t.child_tasks, '');
});

View File

@ -156,13 +156,20 @@ export default {
if (!this.product || !this.product.task_tree) return map;
const traverse = (tasks, prefix) => {
if (!tasks) return;
tasks.forEach((t, i) => {
const num = prefix ? `${prefix}.${i + 1}` : `${i + 1}`;
map[t.id] = `分支 ${num}`;
traverse(t.child_tasks, num);
let spawnIndex = 0;
tasks.forEach((t) => {
if (t.task_type !== 'SPAWN') {
map[t.id] = '主分支';
traverse(t.child_tasks, prefix);
} else {
spawnIndex++;
const num = prefix ? `${prefix}.${spawnIndex}` : `${spawnIndex}`;
map[t.id] = `分支 ${num}`;
traverse(t.child_tasks, num);
}
});
};
this.product.task_tree.forEach((t, i) => {
this.product.task_tree.forEach((t) => {
map[t.id] = '主分支';
traverse(t.child_tasks, '');
});