feat(验证): 添加钢卷号和批次顺序的验证逻辑
在PDI创建和更新操作中添加以下验证: 1. 钢卷号必须为12位 2. 批次编号不能小于已有最大批次 3. 同一批次内顺序号不能重复且必须递增
This commit is contained in:
@@ -165,6 +165,37 @@ def create_pdi(data: PDIPLTMCreate):
|
||||
conn = get_connection()
|
||||
cursor = conn.cursor()
|
||||
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()}
|
||||
cols = ", ".join(f.upper() for f 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()}
|
||||
if not fields:
|
||||
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()])
|
||||
fields["coilid_"] = coilid
|
||||
sql = f"UPDATE PLTM.PDI_PLTM SET {set_clause} WHERE COILID = :coilid_"
|
||||
|
||||
Reference in New Issue
Block a user