feat(验证): 添加钢卷号和批次顺序的验证逻辑

在PDI创建和更新操作中添加以下验证:
1. 钢卷号必须为12位
2. 批次编号不能小于已有最大批次
3. 同一批次内顺序号不能重复且必须递增
This commit is contained in:
2026-04-10 08:04:07 +08:00
parent 89c6d3d1b5
commit 27f01f478f
2 changed files with 73 additions and 2 deletions

View File

@@ -165,6 +165,37 @@ def create_pdi(data: PDIPLTMCreate):
conn = get_connection() conn = get_connection()
cursor = conn.cursor() cursor = conn.cursor()
try: try:
# 1. 验证钢卷号长度
if len(data.coilid) != 12:
raise HTTPException(status_code=400, detail="钢卷号必须为12位")
# 2. 验证批次编号
if data.rollprogramnb:
# 获取数据库中最大的批次编号
cursor.execute("SELECT MAX(ROLLPROGRAMNB) FROM PLTM.PDI_PLTM")
max_batch = cursor.fetchone()[0]
if max_batch and data.rollprogramnb < max_batch:
raise HTTPException(status_code=400, detail="批次编号不能小于已有的最大批次编号")
# 3. 验证顺序号
if data.rollprogramnb and data.sequencenb:
# 检查本批次内是否已存在相同的顺序号
cursor.execute("""
SELECT COUNT(*) FROM PLTM.PDI_PLTM
WHERE ROLLPROGRAMNB = :batch AND SEQUENCENB = :seq
""", {"batch": data.rollprogramnb, "seq": data.sequencenb})
if cursor.fetchone()[0] > 0:
raise HTTPException(status_code=400, detail="本批次内顺序号不能重复")
# 检查本批次内的最大顺序号
cursor.execute("""
SELECT MAX(SEQUENCENB) FROM PLTM.PDI_PLTM
WHERE ROLLPROGRAMNB = :batch
""", {"batch": data.rollprogramnb})
max_seq = cursor.fetchone()[0]
if max_seq and data.sequencenb <= max_seq:
raise HTTPException(status_code=400, detail="本批次内顺序号必须递增")
fields = {k: v for k, v in data.model_dump(exclude_none=True).items()} fields = {k: v for k, v in data.model_dump(exclude_none=True).items()}
cols = ", ".join(f.upper() for f in fields.keys()) cols = ", ".join(f.upper() for f in fields.keys())
vals = ", ".join([f":{k}" for k in fields.keys()]) vals = ", ".join([f":{k}" for k in fields.keys()])
@@ -195,6 +226,46 @@ def update_pdi(coilid: str, data: PDIPLTMUpdate):
fields = {k: v for k, v in data.model_dump(exclude_none=True).items()} fields = {k: v for k, v in data.model_dump(exclude_none=True).items()}
if not fields: if not fields:
raise HTTPException(status_code=400, detail="无更新字段") raise HTTPException(status_code=400, detail="无更新字段")
# 验证批次编号
if "rollprogramnb" in fields:
# 获取数据库中最大的批次编号
cursor.execute("SELECT MAX(ROLLPROGRAMNB) FROM PLTM.PDI_PLTM")
max_batch = cursor.fetchone()[0]
if max_batch and fields["rollprogramnb"] < max_batch:
raise HTTPException(status_code=400, detail="批次编号不能小于已有的最大批次编号")
# 验证顺序号
if "rollprogramnb" in fields or "sequencenb" in fields:
# 获取当前记录的批次编号和顺序号
cursor.execute("""
SELECT ROLLPROGRAMNB, SEQUENCENB FROM PLTM.PDI_PLTM
WHERE COILID = :coilid
""", {"coilid": coilid})
current = cursor.fetchone()
if not current:
raise HTTPException(status_code=404, detail="记录不存在")
new_batch = fields.get("rollprogramnb", current[0])
new_seq = fields.get("sequencenb", current[1])
# 检查本批次内是否已存在相同的顺序号(排除当前记录)
cursor.execute("""
SELECT COUNT(*) FROM PLTM.PDI_PLTM
WHERE ROLLPROGRAMNB = :batch AND SEQUENCENB = :seq AND COILID != :coilid
""", {"batch": new_batch, "seq": new_seq, "coilid": coilid})
if cursor.fetchone()[0] > 0:
raise HTTPException(status_code=400, detail="本批次内顺序号不能重复")
# 检查本批次内的最大顺序号
cursor.execute("""
SELECT MAX(SEQUENCENB) FROM PLTM.PDI_PLTM
WHERE ROLLPROGRAMNB = :batch AND COILID != :coilid
""", {"batch": new_batch, "coilid": coilid})
max_seq = cursor.fetchone()[0]
if max_seq and new_seq <= max_seq:
raise HTTPException(status_code=400, detail="本批次内顺序号必须递增")
set_clause = ", ".join([f"{k.upper()} = :{k}" for k in fields.keys()]) set_clause = ", ".join([f"{k.upper()} = :{k}" for k in fields.keys()])
fields["coilid_"] = coilid fields["coilid_"] = coilid
sql = f"UPDATE PLTM.PDI_PLTM SET {set_clause} WHERE COILID = :coilid_" sql = f"UPDATE PLTM.PDI_PLTM SET {set_clause} WHERE COILID = :coilid_"

View File

@@ -1,9 +1,9 @@
from typing import Optional, List, Dict from typing import Optional, List, Dict
from pydantic import BaseModel from pydantic import BaseModel, Field
class PDIPLTMCreate(BaseModel): class PDIPLTMCreate(BaseModel):
coilid: str coilid: str = Field(..., min_length=12, max_length=12, description="钢卷号必须为12位")
rollprogramnb: Optional[int] = None rollprogramnb: Optional[int] = None
sequencenb: Optional[int] = None sequencenb: Optional[int] = None
schedule_code: Optional[str] = None schedule_code: Optional[str] = None