feat: MES/MOM 出入库状态解绑与直接完结通道(后端契约 + 移动端)
- TaskTransferRequest 新增 finish_directly 开关:闭环当前任务但不产生任何下游任务, 产品 overall_status 保持原样,工人无需再借道「入库(virtual_warehouse)」来关闭任务, 从根源上避免产品被误标「待仓库收货」而卡住 MOM 对账 - 空 assignees 分支加防呆校验:想直接完结必须显式传 finish_directly=true, 杜绝漏填导致「转交」静默退化成「直接完结」的丢件级隐患 - 直接完结跳过 _mark_after_sales_if_reactivated:不产生新任务即不构成「回流返厂」信号, 否则已出库设备的正常收官会把产品误翻成售后机(该标志单向不可回退) - 补齐直接完结的独立响应文案,不再拼出「已创建 0 个下一道工序任务「None」」 - 移动端转交弹窗改为「转交个人 / 入库 / 直接完结」三选一互斥
This commit is contained in:
@ -3,7 +3,7 @@ from __future__ import annotations
|
||||
import uuid
|
||||
from datetime import datetime
|
||||
from typing import Optional
|
||||
from pydantic import BaseModel, Field, field_validator
|
||||
from pydantic import BaseModel, Field, field_validator, model_validator
|
||||
|
||||
|
||||
# ============================================================
|
||||
@ -79,7 +79,13 @@ class TaskRejectRequest(BaseModel):
|
||||
class TaskTransferBranch(BaseModel):
|
||||
"""裂变分支"""
|
||||
task_name: str = Field(..., max_length=200, description="工序名称")
|
||||
assignees: list[str] = Field(..., min_length=1, description="接收人列表")
|
||||
assignees: list[str] = Field(
|
||||
default_factory=list, min_length=0,
|
||||
description=(
|
||||
"接收人列表。允许为空数组,但仅当 finish_directly=True 时合法——"
|
||||
"空分支不产生任何下游任务(见 TaskTransferRequest 的校验)。"
|
||||
),
|
||||
)
|
||||
|
||||
|
||||
class TaskTransferRequest(BaseModel):
|
||||
@ -88,6 +94,27 @@ class TaskTransferRequest(BaseModel):
|
||||
next_task_name: str | None = Field(None, max_length=200, description="[旧版] 下一道工序名称")
|
||||
next_tasks: list[TaskTransferBranch] | None = Field(None, description="[新版] 多分支任务列表")
|
||||
note: str | None = Field(None, description="交接备注")
|
||||
finish_directly: bool = Field(
|
||||
False,
|
||||
description=(
|
||||
"直接完结:闭环当前任务但【不产生任何下游任务】,"
|
||||
"产品 overall_status 保持原样(不入库 → 不会变成「待仓库收货」)。"
|
||||
"置 True 时忽略 next_tasks / next_assignees。"
|
||||
),
|
||||
)
|
||||
|
||||
@model_validator(mode="after")
|
||||
def _reject_silent_empty_branch(self):
|
||||
"""空 assignees 分支会让「转交」静默退化成「直接完结」——任务闭环了却没人接手,
|
||||
是个丢件级隐患。想直接完结必须显式传 finish_directly=true,不能靠漏填凑合。"""
|
||||
if self.finish_directly:
|
||||
return self
|
||||
if any(not b.assignees for b in (self.next_tasks or [])):
|
||||
raise ValueError(
|
||||
"分支 assignees 不能为空;若意图是「直接完结该任务」,"
|
||||
"请改为传 finish_directly=true"
|
||||
)
|
||||
return self
|
||||
|
||||
|
||||
class TaskRecordCreate(BaseModel):
|
||||
|
||||
Reference in New Issue
Block a user